Compare commits

...

6 Commits

Author SHA1 Message Date
qxa 96666dd58d 修改发布脚本
部署生产环境 / 发布版本 (push) Successful in 16s Details
部署生产环境 / 编译发布 (push) Successful in 2m57s Details
部署开发环境 / 编译发布 (push) Successful in 2m27s Details
2024-06-14 11:00:40 +08:00
yj 7f49c5d68e 优化
部署生产环境 / 发布版本 (push) Successful in 19s Details
部署生产环境 / 编译发布 (push) Successful in 2m38s Details
2024-06-13 16:23:10 +08:00
yj 36f66440ac 优化
部署生产环境 / 发布版本 (push) Successful in 12s Details
部署生产环境 / 编译发布 (push) Successful in 3m45s Details
2024-06-13 14:08:12 +08:00
yj 644a5e4238 优化
部署生产环境 / 发布版本 (push) Successful in 19s Details
部署生产环境 / 编译发布 (push) Successful in 1m27s Details
2024-06-13 09:37:10 +08:00
yj c4f2ce2c21 优化
部署生产环境 / 发布版本 (push) Successful in 18s Details
部署生产环境 / 编译发布 (push) Failing after 3m1s Details
2024-06-12 17:56:06 +08:00
yj cce7d4f389 保存时数据不对
部署生产环境 / 发布版本 (push) Successful in 13s Details
部署生产环境 / 编译发布 (push) Successful in 3m52s Details
2024-06-12 17:01:27 +08:00
8 changed files with 204 additions and 100 deletions

View File

@ -6,8 +6,8 @@ on:
- develop
env:
IMAGE_NAME: ${{ gitea.repository_owner }}/usercenter.web
PUBLISH_PATH: usercenter.web
IMAGE_NAME: ${{ gitea.repository_owner }}/maketemplate.web
PUBLISH_PATH: maketemplate.web
PUBLISH_HOST: 10.255.255.44
PUBLISH_PORT: 22
PUBLISH_REPLICAS: 1 #启动副本数量
@ -16,21 +16,17 @@ jobs:
job1:
name: 编译发布
runs-on: linux
container:
image: node:16-bullseye
volumes:
#挂载缓存
- /opt/.runner/node_modules:/cache
steps:
- name: 下载源码
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: 使用缓存
uses: actions/cache@master
with:
mount: |
node_modules
hash_files: |
package.json
- name: 编译项目
run: |

View File

@ -6,8 +6,8 @@ on:
- master
env:
IMAGE_NAME: ${{ gitea.repository_owner }}/usercenter.web
PUBLISH_PATH: usercenter.web
IMAGE_NAME: ${{ gitea.repository_owner }}/maketemplate.web
PUBLISH_PATH: maketemplate.web
PUBLISH_HOST: 10.255.255.74
PUBLISH_PORT: 10022
PUBLISH_REPLICAS: 1 #启动副本数量
@ -21,7 +21,7 @@ jobs:
steps:
- name: 下载源码
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: 发布版本
id: publish_version
@ -33,16 +33,15 @@ jobs:
needs: release
steps:
- name: 下载源码
uses: actions/checkout@v3
- name: 下载源码
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: 使用缓存
uses: actions/cache@master
with:
mount: |
node_modules
hash_files: |
package.json
- name: 编译项目
shell: bash

View File

@ -6,8 +6,8 @@ on:
- staging
env:
IMAGE_NAME: ${{ gitea.repository_owner }}/usercenter.web
PUBLISH_PATH: usercenter.web
IMAGE_NAME: ${{ gitea.repository_owner }}/maketemplate.web
PUBLISH_PATH: maketemplate.web
PUBLISH_HOST: 10.255.255.3
PUBLISH_PORT: 22
PUBLISH_REPLICAS: 1 #启动副本数量
@ -24,13 +24,15 @@ jobs:
steps:
- name: 下载源码
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: 使用缓存
uses: actions/cache@master
with:
mount: |
node_modules
hash_files: |
package.json
- name: 编译项目
shell: bash

View File

@ -6,8 +6,8 @@ on:
- published
env:
IMAGE_NAME: ${{ gitea.repository_owner }}/usercenter.web
PUBLISH_PATH: usercenter.web
IMAGE_NAME: ${{ gitea.repository_owner }}/maketemplate.web
PUBLISH_PATH: maketemplate.web
PUBLISH_HOST: 10.255.255.74
PUBLISH_PORT: 10022
PUBLISH_REPLICAS: 1 #启动副本数量
@ -16,21 +16,18 @@ jobs:
job1:
name: 编译发布
runs-on: linux
container:
image: node:16-bullseye
volumes:
#挂载缓存
- /opt/.runner/node_modules:/cache
steps:
- name: 下载源码
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: 使用缓存
uses: actions/cache@master
with:
mount: |
node_modules
hash_files: |
package.json
- name: 编译项目
shell: bash

View File

@ -2,12 +2,12 @@ version: "3"
services:
usercenter-web:
image: ${REGISTRY:-harbor.w.23544.com:8843}/marking/usercenter.web:${TAG:-latest}
image: ${REGISTRY:-harbor.w.23544.com:8843}/marking/maketemplate.web:${TAG:-latest}
hostname: marking
environment:
TZ: Asia/Shanghai
ports:
- 4400:80
- 8898:80
deploy:
mode: replicated
replicas: ${REPLICAS:-1}

View File

@ -2,21 +2,37 @@
<div>
<span>坐标</span>
<div>
<el-button type="primary" @click="changeFabricPosition(true, 'top')">上移</el-button>
<el-button type="primary" @click="changeFabricPosition(false, 'top')">下移</el-button>
<el-button type="primary" @click="changeFabricPosition(true, 'left')">左移</el-button>
<el-button type="primary" @click="changeFabricPosition(false, 'left')">右移</el-button>
<el-button type="primary" @click="changeFabricPosition(true, 'top')"
>上移</el-button
>
<el-button type="primary" @click="changeFabricPosition(false, 'top')"
>下移</el-button
>
<el-button type="primary" @click="changeFabricPosition(true, 'left')"
>左移</el-button
>
<el-button type="primary" @click="changeFabricPosition(false, 'left')"
>右移</el-button
>
</div>
</div>
<div>
<span>宽度</span>
<el-input-number v-model="fabricPosition.width" :min="1" @change="changeFabricPosition($event, 'width')"
:max="fabricPosition.imgDomWidth" />
<el-input-number
v-model="fabricPosition.width"
:min="1"
@change="changeFabricPosition($event, 'width')"
:max="fabricPosition.imgDomWidth"
/>
</div>
<div>
<span>高度</span>
<el-input-number v-model="fabricPosition.height" :min="1" @change="changeFabricPosition($event, 'height')"
:max="fabricPosition.imgDomHight" />
<el-input-number
v-model="fabricPosition.height"
:min="1"
@change="changeFabricPosition($event, 'height')"
:max="fabricPosition.imgDomHight"
/>
</div>
</template>
<script lang="ts" setup>
@ -28,8 +44,8 @@ const fabricPosition = reactive<any>({
width: 0,
height: 0,
imgDomHight: 1,
imgDomWidth: 1
})
imgDomWidth: 1,
});
const setSize = (data: any, imgDomWidth: number, imgDomHight: number): void => {
fabricPosition.top = data.top;
@ -38,23 +54,22 @@ const setSize = (data: any, imgDomWidth: number, imgDomHight: number): void => {
fabricPosition.height = data.height;
fabricPosition.imgDomWidth = imgDomWidth;
fabricPosition.imgDomHight = imgDomHight;
}
};
const changeFabricPosition = (value: number | boolean, str: string): void => {
if (typeof value === 'boolean') {
if (str === 'top') {
props.change(value ? fabricPosition.top-- : fabricPosition.top++, str)
if (typeof value === "boolean") {
if (str === "top") {
props.change(value, str);
} else {
props.change(value ? fabricPosition.left-- : fabricPosition.left++, str)
props.change(value, str);
}
} else {
props.change(value, str)
props.change(value, str);
}
}
};
defineExpose({
setSize,
});
</script>
<style lang="scss" scoped></style>
<style lang="scss" scoped></style>

View File

@ -9,7 +9,7 @@
>
<div>
<div style="font-size: 20px; margin-bottom: 20px; font-weight: bold">
锁定模板后无法修改请确认模板信息后操作
锁定模板后仅可调整位置和大小无法增删题目请确认模板信息后操作
</div>
<div style="height: 70vh; overflow-y: auto">
<el-collapse v-model="activeNames">
@ -17,7 +17,7 @@
<div v-if="item.key !== 'otherPoint'">
<div v-if="item.data.length">
<div v-for="row in item.data">
{{ row.questionBefore }}-{{ row.questionAfter }} 总分{{ row.score }}
{{ row.questionBefore }}-{{ row.questionAfter }} 每题{{ row.score }}
</div>
</div>
<div v-else>

View File

@ -24,7 +24,12 @@
<img src="@/assets/image/icon1.png" alt="" v-if="item.index !== 5" />
</div>
</div>
<div class="warp-nav-tab-delete" title="清空全部痕迹" @click="clearFabricGroup">
<div
class="warp-nav-tab-delete"
title="清空全部痕迹"
@click="clearFabricGroup"
v-if="!isLockStatus"
>
<img src="@/assets/image/icon2.png" alt="" />
<span>清空全部痕迹</span>
</div>
@ -92,6 +97,7 @@
alt=""
id="picture-img"
style="user-select: none"
@load="canvasLoad"
/>
<canvas id="picture"></canvas>
</div>
@ -167,8 +173,8 @@
type="primary"
size="large"
@click="btnClick('lock')"
:disabled="isLock"
> </el-button
:disabled="isLockStatus || isLockDisabled"
>{{ isLockStatus ? "已锁定" : "锁 定" }}</el-button
>
</div>
</div>
@ -236,6 +242,7 @@
<span>考号长度</span>
<div>
<el-input-number
:disabled="isLockStatus"
:min="4"
:max="12"
v-model="drawerForm.examId.examIdLength"
@ -270,9 +277,9 @@
</div>
</div>
<FabricSize
:change="changeFabricPosition"
:change="changeFabricPositionNumber"
ref="FabricSizeRef"
v-if="ctx.getActiveObject()"
v-if="currentFabric"
/>
</div>
<div class="drawer-custom-style-body-footer">
@ -310,7 +317,10 @@
<div>
<span>排列</span>
<div>
<el-radio-group v-model="drawerForm.objective.range">
<el-radio-group
v-model="drawerForm.objective.range"
:disabled="isLockStatus"
>
<el-radio :value="0">横向</el-radio>
<el-radio :value="1">竖向</el-radio>
</el-radio-group>
@ -323,7 +333,7 @@
style="width: 164px"
v-model="drawerForm.objective.optionNumber"
:min="2"
:disabled="drawerForm.objective.questionTypeValue === 2"
:disabled="drawerForm.objective.questionTypeValue === 2 || isLockStatus"
:step-strictly="true"
:max="24"
/>
@ -333,6 +343,7 @@
<span>题量</span>
<div>
<el-input-number
:disabled="isLockStatus"
style="width: 164px"
v-model="drawerForm.objective.questionNumber"
:min="1"
@ -345,6 +356,7 @@
<span>题号</span>
<div>
<el-input-number
:disabled="isLockStatus"
v-model="drawerForm.objective.questionBefore"
:min="1"
:controls="false"
@ -364,6 +376,7 @@
<span>每题分数</span>
<div>
<el-input-number
:disabled="isLockStatus"
style="width: 164px"
v-model="drawerForm.objective.score"
:min="0"
@ -402,9 +415,9 @@
</div>
</div>
<FabricSize
:change="changeFabricPosition"
:change="changeFabricPositionNumber"
ref="FabricSizeRef"
v-if="ctx.getActiveObject()"
v-if="currentFabric"
/>
</div>
<div class="drawer-custom-style-body-footer">
@ -449,6 +462,7 @@
<div>
<el-input-number
v-model="drawerForm.subjective.questionBefore"
:disabled="isLockStatus"
:min="1"
:controls="false"
:step-strictly="true"
@ -461,6 +475,7 @@
<el-input-number
v-model="drawerForm.subjective.questionAfter"
:disabled="isLockStatus"
:min="1"
:controls="false"
:step-strictly="true"
@ -473,6 +488,7 @@
<div>
<el-input-number
v-model="drawerForm.subjective.score"
:disabled="isLockStatus"
style="width: 152px"
:min="0"
:precision="1"
@ -481,9 +497,9 @@
</div>
</div>
<FabricSize
:change="changeFabricPosition"
:change="changeFabricPositionNumber"
ref="FabricSizeRef"
v-if="ctx.getActiveObject()"
v-if="currentFabric"
/>
</div>
<div class="drawer-custom-style-body-footer">
@ -716,7 +732,8 @@ const templateInfo = reactive<any>({
questionList: [],
otherData: [],
});
const isLock = ref<boolean>(false);
const isLockStatus = ref<boolean>(false);
const isLockDisabled = ref<boolean>(false);
const currentNavListIndex = ref<number>(3);
//
const ctx = ref<any>(null);
@ -727,7 +744,8 @@ const currentFabric = ref<any>(null);
onMounted(() => {
GetOcrDetail(router.currentRoute.value.query.mid as string).then((res: any) => {
if (res.code === 200) {
const { mainName, hasPosition, paperType, detail } = res.data;
const { mainName, hasPosition, paperType, detail, isLock } = res.data;
isLockStatus.value = isLock;
templateInfo.name = mainName;
templateInfo.hasPosition = hasPosition;
templateInfo.type = paperType === 1 ? "A3" : "A4";
@ -740,18 +758,6 @@ onMounted(() => {
: (templateInfo.tailsList = JSON.parse(JSON.parse(item.tempData).tempData));
}
});
nextTick(() => {
initCanvas();
navListIndex.value = templateInfo.hasPosition ? 0 : 1; //1
if (!templateInfo.hasPosition) {
//
navList.splice(0, 1);
}
setQuestionList(); //
showFabricData(); //
setStepClick(currentNavListIndex.value, false); //
setNavTitle(); //
});
}
});
});
@ -760,34 +766,51 @@ watch(
() => templateInfo,
(_new, _old) => {
if (!_new.headList[2].point.length && !_new.tailsList[2].point.length) {
isLock.value = true;
isLockDisabled.value = true;
currentNavListIndex.value = 2;
return;
}
if (!_new.headList[1].point.length && !_new.tailsList[1].point.length) {
isLock.value = true;
isLockDisabled.value = true;
currentNavListIndex.value = 1;
return;
}
if (_new.hasPosition) {
if (_new.imgSrc.length === 2) {
if (_new.headList[0].point.length !== 4 || _new.tailsList[0].point.length !== 4) {
isLock.value = true;
isLockDisabled.value = true;
currentNavListIndex.value = 0;
return;
}
} else {
if (_new.headList[0].point.length !== 4) {
isLock.value = true;
isLockDisabled.value = true;
currentNavListIndex.value = 0;
return;
}
}
}
isLock.value = false;
isLockDisabled.value = false;
},
{ deep: true }
);
//
const canvasLoad = (): void => {
if (!ctx.value) {
initCanvas();
navListIndex.value = templateInfo.hasPosition ? 0 : 1; //1
if (!templateInfo.hasPosition) {
//
navList.splice(0, 1);
}
setQuestionList(); //
showFabricData(); //
setStepClick(currentNavListIndex.value, false); //
setNavTitle(); //
}
};
//
const initCanvas = (): void => {
imgDom.value = document.getElementById("picture-img");
@ -796,6 +819,10 @@ const initCanvas = (): void => {
height: imgDom.value.clientHeight,
});
ctx.value.on("mouse:down", (e: any) => {
if (isLockStatus.value && !e.target) {
ElMessage.error("已锁定,无法新增!");
return;
}
const templateInfoItem = getTemplateInfo(true);
if (templateInfoItem[0].point.length === 4) {
if (isMoveOutView()) {
@ -812,6 +839,9 @@ const initCanvas = (): void => {
}
}
}
if (e.target) {
setStepClick(e.target.get("fabricType"));
}
canvasMouseDown(e.e, e.target, e.subTargets);
});
ctx.value.on("mouse:move", (e: any) => {
@ -900,9 +930,15 @@ const canvasMouseDown = (e: MouseEvent, target: any, subTargets: any): void => {
const itemTarget = target
.getObjects()
.find((i: any) => i.fabricId === row.fabricId);
itemTarget && row.fabricId === itemTarget.fabricId
? itemTarget.set({ visible: true })
: row.set({ visible: false });
if (itemTarget && row.fabricId === itemTarget.fabricId) {
if (isLockStatus.value && itemTarget.get("text") === "删除") {
row.set({ visible: false });
} else {
itemTarget.set({ visible: true });
}
} else {
row.set({ visible: false });
}
} else {
row.set({ visible: false });
}
@ -968,7 +1004,7 @@ const canvasMouseUp = async (): Promise<void> => {
hasControls: false,
subTargetCheck: true,
borderColor: "transparent",
selectionBackgroundColor: "transparent",
selectionBackgroundColor: "red",
fabricType: navListIndex.value,
fabricId: cteatedNumber(),
}).on("mousemove", (e: any) => {
@ -1011,9 +1047,13 @@ const canvasMouseUp = async (): Promise<void> => {
}).then((res) => {
if (res.code === 200) {
const rectTitle = ["右上角", "右下角"];
const rectFooterTitle = ["左下角", "右下角"];
if (rectTitle.includes(getCurrentText())) {
res.data.x = res.data.x + res.data.width;
}
if (rectFooterTitle.includes(getCurrentText())) {
res.data.y = res.data.y - res.data.height;
}
addFabric(
"rect",
{ ...obj, title: getTextTitle(), rectPosition: res.data },
@ -1021,7 +1061,9 @@ const canvasMouseUp = async (): Promise<void> => {
left: rectTitle.includes(getCurrentText())
? res.data.x - res.data.width
: res.data.x,
top: res.data.y,
top: rectFooterTitle.includes(getCurrentText())
? res.data.y + res.data.height
: res.data.y,
width: res.data.width,
height: res.data.height,
stroke: "red",
@ -1444,7 +1486,7 @@ const isDisabledDraw = (): boolean => {
fabricItem.forEach((item: any) => {
let row = item.getObjects().filter((obj: any) => obj.get("text") === "缺考");
if (row) {
hasQueKao.push(row);
hasQueKao.push(...row);
}
});
isDisabledDrawStatus = hasQueKao.length === 0;
@ -1605,7 +1647,7 @@ const showFabricData = (): void => {
hasControls: false,
subTargetCheck: true,
borderColor: "transparent",
selectionBackgroundColor: "transparent",
selectionBackgroundColor: "rgba(255,0,0,0.5)",
fabricType: item.fabricType,
left: item.left,
top: item.top,
@ -1672,6 +1714,22 @@ const cteatedNumber = (): string => {
return `${Math.floor(Math.random() * 100000000)}+${+new Date()}`;
};
//
const changeFabricPositionNumber = (value: number | boolean, str: string): void => {
let number = 0;
if (typeof value === "boolean") {
number = JSON.parse(JSON.stringify(currentFabric.value.target.get(str)));
if (value) {
number--;
} else {
number++;
}
} else {
number = value;
}
changeFabricPosition(number, str);
};
//
const changeFabricPosition = (value: number, str: string): void => {
if (value) {
@ -1941,7 +1999,7 @@ const changeFabricInfo = (bool: boolean): void => {
left: fabricItem.get("customFrom").left,
top: fabricItem.get("customFrom").top,
width: fabricItem.get("customFrom").width,
height: fabricItem.get("customFrom").top,
height: fabricItem.get("customFrom").height,
};
if (bool) {
switch (navListIndex.value) {
@ -2239,11 +2297,11 @@ const objectiveNumber = (
): void => {
//
const obj = {
fontSize: 14,
fontSize: 12,
fill: "black",
fontWeight: "bold",
fontWeight: "normal",
fabricId: cteatedNumber(),
backgroundColor: "rgba(255,255,255,0.7)",
backgroundColor: "transparent",
};
if (drawerForm.objective.range) {
//
@ -2476,6 +2534,10 @@ const isQuestionNumerRepeat = (): boolean => {
//
const changeExamType = (type: number): void => {
if (isLockStatus.value) {
ElMessage.error("已锁定,无法修改!");
return;
}
drawerForm.examId.examType = type;
};
@ -2516,6 +2578,10 @@ const changeQuestion = (e?: any): void => {
//
const changeObjectiveQuestionType = (item: { value: number; text: string }): void => {
if (isLockStatus.value) {
ElMessage.error("已锁定,无法修改!");
return;
}
if (navListIndex.value === 3) {
drawerForm.objective.questionTypeValue = item.value;
drawerForm.objective.optionNumber =
@ -2840,16 +2906,40 @@ const changeData = (): any => {
item.from.subjectPoint =
item.tempData[1].point.length == 1 ? item.tempData[1].point[0].customFrom : {};
item.from.examIDPoint = item.tempData[2].point.map((row: any) => {
return row.customFrom;
return {
...row.customFrom,
width: row.width,
height: row.height - 36.16,
top: row.top + 17,
left: row.left,
};
});
item.from.objectiveQuestionsPoint = item.tempData[3].point.map((row: any) => {
return row.customFrom;
return {
...row.customFrom,
width: row.width,
height: row.height - 36.16,
top: row.top + 17,
left: row.left,
};
});
item.from.subjectiveQuestionsPoint = item.tempData[4].point.map((row: any) => {
return row.customFrom;
return {
...row.customFrom,
width: row.width,
height: row.height - 36.16,
top: row.top + 17,
left: row.left,
};
});
item.from.otherPoint = item.tempData[5].point.map((row: any) => {
return row.customFrom;
return {
...row.customFrom,
width: row.width,
height: row.height - 36.16 / 2,
top: row.top + 17,
left: row.left,
};
});
divideByTwoProperties(
item.from.subjectiveQuestionsPoint,
@ -3114,14 +3204,19 @@ const save = async (isShow: boolean = false): Promise<void> => {
width: 100%;
overflow: auto;
@mixin isPageType($number, $type) {
@mixin isPageType($type) {
width: 100%;
height: 100%;
> #zoom-div {
margin: 0 auto;
width: calc(210mm * #{$number});
height: 297mm;
@if $type == "A3" {
width: 1570px;
} @else {
width: 1200px;
}
height: auto;
flex-shrink: 0;
position: relative;
transform-origin: left top;
@ -3169,11 +3264,11 @@ const save = async (isShow: boolean = false): Promise<void> => {
}
.A4 {
@include isPageType(1, "A4");
@include isPageType("A4");
}
.A3 {
@include isPageType(2, "A3");
@include isPageType("A3");
}
}
}