Merge branch 'main' into shen

pull/1/head
Dragon 2 years ago
commit 30080d27f4

@ -11,7 +11,8 @@
"lint": "eslint .",
"lint:fix": "eslint . --fix",
"cleanup": "rimraf node_modules && rimraf pnpm-lock.yaml",
"prepare": "husky install"
"prepare": "husky install",
"postinstall": "patch-package"
},
"dependencies": {
"@vueup/vue-quill": "^1.2.0",
@ -26,6 +27,7 @@
"mitt": "^3.0.1",
"mockjs": "^1.1.0",
"naive-ui": "^2.38.1",
"patch-package": "^8.0.0",
"pinia": "^2.0.33",
"qs": "^6.11.2",
"sortablejs": "^1.15.1",

@ -0,0 +1,13 @@
diff --git a/node_modules/naive-ui/es/pagination/src/Pagination.mjs b/node_modules/naive-ui/es/pagination/src/Pagination.mjs
index 5bd975b..e1c6ebc 100644
--- a/node_modules/naive-ui/es/pagination/src/Pagination.mjs
+++ b/node_modules/naive-ui/es/pagination/src/Pagination.mjs
@@ -702,7 +702,7 @@ export default defineComponent({
theme: mergedTheme.peers.Input,
themeOverrides: mergedTheme.peerOverrides.Input,
onChange: handleQuickJumperChange
- })) : null;
+ }),h('span',{},'页')) : null;
default:
return null;
}

@ -66,6 +66,20 @@ export async function saveNote(note: string) {
})
}
/**
*
* @returns
*/
export async function getToolsCount() {
return http.request({
url: `/ocr/aitools/toolsCount`,
method: 'get',
params: { },
// headers: { 'Content-Type': ContentTypeEnum.FORM_DATA },
})
}
/**
*
* @param note

@ -6,18 +6,13 @@ import { ContentTypeEnum } from '@/enums/httpEnum'
*
* @returns
*/
export async function getCode(params: PageParam) {
export async function getCode(params: {phone: string,agentcode:string}) {
const res = await http.request({
url: `/web/smslogin/sendcode`,
method: 'get',
params,
})
const { data: { records, pages } } = res
return {
pageCount: pages,
data: records,
}
return res
}
/**

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 512 512"><path d="M304 192v32c0 6.6-5.4 12-12 12h-56v56c0 6.6-5.4 12-12 12h-32c-6.6 0-12-5.4-12-12v-56h-56c-6.6 0-12-5.4-12-12v-32c0-6.6 5.4-12 12-12h56v-56c0-6.6 5.4-12 12-12h32c6.6 0 12 5.4 12 12v56h56c6.6 0 12 5.4 12 12zm201 284.7L476.7 505c-9.4 9.4-24.6 9.4-33.9 0L343 405.3c-4.5-4.5-7-10.6-7-17V372c-35.3 27.6-79.7 44-128 44C93.1 416 0 322.9 0 208S93.1 0 208 0s208 93.1 208 208c0 48.3-16.4 92.7-44 128h16.3c6.4 0 12.5 2.5 17 7l99.7 99.7c9.3 9.4 9.3 24.6 0 34zM344 208c0-75.2-60.8-136-136-136S72 132.8 72 208s60.8 136 136 136s136-60.8 136-136z" fill="currentColor"></path></svg>

After

Width:  |  Height:  |  Size: 678 B

@ -107,6 +107,7 @@ const pagination = reactive({
value: 50,
},
],
showQuickJumper: true,
});
const tableData = ref<Array<RowData>>([]);
const keyword = ref("");

@ -121,6 +121,7 @@ const pagination = reactive({
value: 50,
},
],
showQuickJumper: true,
})
const tableData = ref<Array<RowData>>([])
const selectionIds = ref<DataTableRowKey[]>([])

@ -397,6 +397,7 @@ const pagination = reactive({
value: 50,
},
],
showQuickJumper: true,
})
const tableData = ref<Array<RowData>>([])
const selectionIds = ref<DataTableRowKey[]>([])

@ -2,7 +2,8 @@
import { onMounted, ref } from "vue";
const item = {
img: "/src/assets/images/test.png",
// img: "/src/assets/images/test.png",
img:'http://47.93.59.251/api/image/thumbnail_1752999610491604992.jpeg',
checked: false,
title: "YP4567890545",
date: "2023-12-19 12:09:18",
@ -10,7 +11,7 @@ const item = {
const data = ref<any[]>([]);
onMounted(() => {
for (let i = 0; i < 10; i++) {
for (let i = 0; i < 20; i++) {
data.value.push(item as any);
}
});
@ -36,7 +37,7 @@ onMounted(() => {
:key="index"
:style="index == 2 ? 'color:#02C984' : 'color:#507AFD'"
>
待确认
{{ index==1?'待确认':'张思' }}
</div>
</div>
</div>
@ -85,8 +86,7 @@ onMounted(() => {
.title,
.date {
font-size: 11px;
font-family: PingFang SC, PingFang SC-Medium;
font-weight: Medium;
font-weight: bolder;
text-align: left;
color: #323233;
line-height: 16px;
@ -101,8 +101,7 @@ onMounted(() => {
width: 31px;
height: 14px;
font-size: 10px;
font-family: PingFang SC, PingFang SC-Regular;
font-weight: Regular;
font-weight: bolder;
text-align: left;
// color: #507afd;
line-height: 14px;
@ -118,16 +117,14 @@ onMounted(() => {
justify-content: flex-end;
.resovle_action {
font-size: 12px;
font-family: PingFang SC, PingFang SC-Medium;
font-weight: Medium;
font-weight: bolder;
text-align: left;
color: #507afd;
line-height: 17px;
}
.reject_action {
font-size: 12px;
font-family: PingFang SC, PingFang SC-Medium;
font-weight: Medium;
font-weight: bolder;
text-align: left;
color: #ff4e4f;
line-height: 17px;

@ -15,9 +15,10 @@ const showList = ref(false);
<Aside />
<!-- 内容 -->
<Content @changeShow="showList=true" v-if="!showList"/>
<Content @changeShow="showList=true" />
<!-- 任务管理 -->
<ListContent v-else />
<!-- TODO:本地演示即可 上传注释注释 -->
<!-- <ListContent /> -->
</div>
</template>

@ -1,11 +1,12 @@
<script lang="ts" setup>
import { favorite, getConditionList, unfavorite } from "@/api/home/filter";
import { favorite, getConditionList, unfavorite, sort } from "@/api/home/filter";
import { asideMap } from "@/config/aside";
import { useInfiniteScroll } from "@vueuse/core";
import { debounce } from "lodash-es";
import { onMounted, reactive, ref,watch } from "vue";
import { onMounted, reactive, ref, watch } from "vue";
import type { FilterSearchParam } from "/#/api";
import type { Filter, FilterEntity } from "/#/home";
import { VueDraggable } from "vue-draggable-plus";
defineOptions({ name: "AdvanceFilter" });
@ -25,6 +26,7 @@ const emit = defineEmits<{
}>();
const data = ref<FilterEntity[]>([]);
const unData = ref<FilterEntity[]>([]);
let loading = false;
const canloadMore = true;
const el = ref<HTMLDivElement | null>(null);
@ -71,10 +73,9 @@ useInfiniteScroll(
},
{ distance: 10, interval: 300, canLoadMore: () => false }
);
const showClick = ()=>{
console.log('showClick')
inputHandler('')
}
const showClick = () => {
inputHandler("");
};
async function loadMore() {
if (loading || el.value == null) return;
@ -108,7 +109,7 @@ async function featchList() {
//
function generateFilterEntityList(data) {
const filterEntityList = data.map((item) => {
const { searchname, iztop, ocrUsersearchchildList, id } = item;
const { searchname, iztop, ocrUsersearchchildList, id, reorder } = item;
const list = ocrUsersearchchildList.map((item) => {
const { searchfield, searchvalue } = item;
@ -131,6 +132,7 @@ function generateFilterEntityList(data) {
favorite: iztop,
isDefaultFilter: false,
filterList: list,
reorder,
};
});
@ -143,9 +145,29 @@ function selectHandler(item: FilterEntity) {
}
const inputHandler = debounce((word) => {
if (word) {
pagination.pageSize = 300;
} else {
pagination.pageSize = 10;
}
keyword.value = word;
featchList().then((list) => {
data.value = list;
let dataArr: FilterEntity[] = [];
let unDataArr: FilterEntity[] = [];
list.map((item) => {
if (item.favorite && !item.isDefaultFilter) {
dataArr.push(item);
}
if (!item.favorite && !item.isDefaultFilter) {
unDataArr.push(item);
}
});
data.value = dataArr.sort(
(a, b) => Number((a as any).reorder) - Number((b as any).reorder)
);
unData.value = unDataArr.sort(
(a, b) => Number((a as any).reorder) - Number((b as any).reorder)
);
});
}, 300);
@ -158,6 +180,15 @@ function favoriteHandler(event: MouseEvent, item: any) {
if (!isDefaultFilter) {
item.favorite = true;
favorite(id);
data.value.map((v, index) => {
if (v.id == id) {
sort(v.id, 0);
} else {
sort(v.id, index + 1);
}
});
inputHandler(keyword.value);
}
}
@ -170,8 +201,15 @@ function unFavoriteHandler(event: MouseEvent, item) {
if (!isDefaultFilter) {
item.favorite = false;
unfavorite(id);
inputHandler(keyword.value);
}
}
const moveEnd = () => {
unData.value.map((v, index) => {
sort(v.id, index);
});
};
</script>
<template>
@ -211,6 +249,7 @@ function unFavoriteHandler(event: MouseEvent, item) {
/>
</template>
</n-input>
<ul ref="el" class="wrapper-left-list">
<li
v-for="(item, index) in data"
@ -233,6 +272,38 @@ function unFavoriteHandler(event: MouseEvent, item) {
/>
<div v-html="item.name" />
</li>
<VueDraggable
@end="moveEnd"
v-model="unData"
filter=".draggable-li[draggable='false']"
class="draggable-ul"
:animation="150"
group="shared"
>
<li
v-for="(item, index) in unData"
:key="index"
style="display: flex; align-items: center"
@click="selectHandler(item)"
class="cursor-move draggable-li fix"
:draggable="true"
>
<SvgIcon
v-if="item.favorite && !item.isDefaultFilter"
name="favorite-fill"
color="#fd9b0a"
size="18"
@click="unFavoriteHandler($event, item)"
/>
<SvgIcon
v-else-if="!item.favorite && !item.isDefaultFilter"
name="favorite-unfill"
size="18"
@click="favoriteHandler($event, item)"
/>
<div v-html="item.name" />
</li>
</VueDraggable>
</ul>
</div>
</n-spin>

@ -79,8 +79,9 @@ const pagination = reactive({
page: 1,
pageCount: 1,
pageSize: 10,
showSizePicker:true,
showSizePicker: true,
pageSizes: [
{
label: "10 每页",
value: 10,
@ -98,6 +99,7 @@ const pagination = reactive({
value: 50,
},
],
showQuickJumper: true,
});
const tableData = ref<Array<RowData>>([]);
const keyword = ref("");
@ -302,7 +304,7 @@ const inputHandler = debounce((word) => {
<SvgIcon size="14px" name="magnifying-1" color="#fff" />
</template>
</n-input>
<n-button type="info" style="background:#507AFD" @click="handleClick">
<n-button type="info" style="background: #507afd" @click="handleClick">
创建
<template #icon>
<img
@ -323,7 +325,7 @@ const inputHandler = debounce((word) => {
:pagination="pagination"
:row-key="rowKey"
@update:page="handlePageChange"
@update-page-size="handlePageSizeChange"
@update-page-size="handlePageSizeChange"
@update:checked-row-keys="handleCheck"
/>
</div>

@ -1,13 +1,4 @@
<script lang="ts" setup>
import { useInfiniteScroll } from '@vueuse/core'
import imagesloaded from 'imagesloaded'
import { debounce } from 'lodash-es'
import Masonry from 'masonry-layout'
import { useMessage } from 'naive-ui'
import { computed, nextTick, onMounted, onUnmounted, onUpdated, reactive, ref, unref, watch } from 'vue'
import GeneratePackageModal from './modal/GeneratePackageModal.vue'
import PackageSettingsModal from './modal/PackageSettingsModal.vue'
import LoginSuccessModal from './modal/LoginSuccessModal.vue'
import { getPictureList, oneClickCheck } from '@/api/home/main'
import avatar from '@/assets/images/avatar.jpg'
import { timeOptions, viewOptions } from '@/config/home'
@ -17,6 +8,15 @@ import { getViewportOffset } from '@/utils/domUtils'
import { hideDownload } from '@/utils/image'
import emitter from '@/utils/mitt'
import { getImgUrl } from '@/utils/urlUtils'
import { useInfiniteScroll } from '@vueuse/core'
import imagesloaded from 'imagesloaded'
import { debounce } from 'lodash-es'
import Masonry from 'masonry-layout'
import { useMessage } from 'naive-ui'
import { computed, nextTick, onMounted, onUnmounted, onUpdated, reactive, ref, unref, watch } from 'vue'
import GeneratePackageModal from './modal/GeneratePackageModal.vue'
import LoginSuccessModal from './modal/LoginSuccessModal.vue'
import PackageSettingsModal from './modal/PackageSettingsModal.vue'
const deviceHeight = ref(600)
let _masonry: null | Masonry = null
@ -141,6 +141,7 @@ async function featchList() {
ocrPictureclass: item.ocrPictureclass,
uphead: item.uphead,
similar: item.similarityscore || 0,
imgName: item.imgname
}
})
@ -162,14 +163,14 @@ async function loadMore() {
const gridHeight = computed(() => {
let height = ""
if(viewMode.value ==='masonry'){
height =''
}else if(viewMode.value ==='horizontalVersion'){
height ='145px'
}else if(viewMode.value ==='verticalVersion'){
height ='320px'
}else if(viewMode.value ==='3:4'){
height ='240px'
if (viewMode.value === 'masonry') {
height = ''
} else if (viewMode.value === 'horizontalVersion') {
height = '145px'
} else if (viewMode.value === 'verticalVersion') {
height = '320px'
} else if (viewMode.value === '3:4') {
height = '240px'
}
return height
})
@ -210,7 +211,7 @@ onMounted(() => {
nextTick(() => {
computeListHeight()
//
showLoginSuccessModal()
// showLoginSuccessModal()
})
})
@ -264,6 +265,52 @@ function sortHandler() {
sortBy.value = sortBy.value === 'asc' ? 'desc' : 'asc'
refreshHandler()
}
async function downloadImage(item) {
if (!item.thumburl) {
message.error('请输入有效的图片链接地址')
return;
}
try {
// 使 fetch GET
const response = await fetch(item.thumburl, {
method: 'GET',
mode: 'cors', //
cache: 'default',
});
//
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
// Blob
const blob = await response.blob();
// a
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = item.imgName; //
link.style.display = 'none'; //
// DOM
document.body.appendChild(link);
//
link.click();
//
URL.revokeObjectURL(link.href);
document.body.removeChild(link);
} catch (error) {
console.error('下载图片时发生错误:', error);
}
}
function previewHandler(index: number,event: MouseEvent) {
event.stopImmediatePropagation();
event.stopPropagation();
if (imageRef.value?.[index] && (imageRef.value[index] as any).src)
(imageRef.value?.[index] as any).mergedOnClick();
}
</script>
<template>
@ -307,17 +354,27 @@ function sortHandler() {
class="wrapper-content-item-img" :class="{ 'wrapper-content-item-img-fit': viewMode !== 'masonry' }"
:src="item.imgUrl"
> -->
<n-image
class="img" :img-props="{ onClick: hideDownload }"
:class="{ 'img-fit': viewMode === 'horizontalVersion', 'img-full': viewMode === '3:4'|| viewMode === 'verticalVersion' }" :preview-src="item.imgUrl" :src="item.thumburl"
/>
<n-image class="img" :img-props="{ onClick: hideDownload }"
:class="{ 'img-fit': viewMode === 'horizontalVersion', 'img-full': viewMode === '3:4' || viewMode === 'verticalVersion' }"
:preview-src="item.imgUrl" :src="item.thumburl" ref="imageRef" />
<div class="percent">
<SvgIcon size="42" name="tag" />
<div class="val">
{{ `${item.similar}%` }}
</div>
</div>
<div class="glass">
<SvgIcon size="16" name="download" style="margin-top: -6px;cursor: pointer;"
@click="downloadImage(item)" />
</div>
<div class="info">
<div class="footer">
<div class="img-name">{{ item.imgName }}</div>
<div class="icon-wrap" @click="previewHandler(index, $event)">
<SvgIcon size="13" name="magnifying-2" style="cursor: pointer;margin-left: 3px;color:#898481" />
</div>
</div>
<div class="left">
<n-avatar :src="getAvatar(item.uphead)" class="avatar" round />
<span>{{ item.upname }}</span>
@ -399,9 +456,11 @@ function sortHandler() {
width: 100%;
overflow: hidden;
}
.img-full {
width: 100%;
overflow: hidden;
::v-deep(img) {
width: 100%;
height: 100%;
@ -413,6 +472,7 @@ function sortHandler() {
display: flex;
justify-content: space-between;
margin-top: 4px;
position: relative;
.left {
display: flex;
@ -448,34 +508,92 @@ function sortHandler() {
margin-bottom: 10px;
overflow: hidden;
position: relative;
}
transition: 0.5s;
.percent {
.glass {
position: absolute;
display: none !important;
background-color: #FFF;
border-radius: 6px;
padding: 3px;
top: 10px;
right: 10px;
width: 22px;
height: 22px;
}
.footer {
display: none;
width: 100%;
height: 40px;
position: absolute;
text-align: center;
z-index: 3;
right: 0px;
top: -6px;
color: #FFF;
.val {
position: absolute;
left: 0;
top: 0;
display: block;
width: 100%;
height: 100%;
top: -45px;
justify-content: space-between;
align-items: center;
padding: 0 10px;
background: rgba(0, 0, 0, .35);
border-radius: 7px;
.img-name {
width: 70%;
color: #FFF;
/* 设置文本溢出时的样式为省略号 */
text-overflow: ellipsis;
/* 隐藏超出容器的文本 */
overflow: hidden;
/* 确保文本不换行 */
white-space: nowrap;
}
.icon-wrap {
width: 22px;
height: 22px;
background-color: #FFF;
border-radius: 6px;
}
}
&:hover {
.percent {
display: none;
}
.glass {
display: block !important;
}
.info .footer {
display: flex;
align-items: center;
justify-content: center;
font-size: 12px;
font-family: PingFang SC, PingFang SC-Semibold;
font-weight: Semibold;
text-align: left;
color: #ffffff;
line-height: 24px;
}
}
}
.percent {
position: absolute;
text-align: center;
z-index: 3;
right: 0px;
top: -6px;
color: #FFF;
.val {
position: absolute;
left: 0;
top: 0;
display: block;
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
font-size: 12px;
font-family: PingFang SC, PingFang SC-Semibold;
font-weight: Semibold;
text-align: left;
color: #ffffff;
line-height: 24px;
}
}
.scroll {
overflow-y: scroll;

@ -1,5 +1,6 @@
<script lang="ts" setup>
import { ref } from "vue";
import { onMounted, ref } from "vue";
import {getToolsCount } from '@/api/home/main'
const emit = defineEmits<{
(e: "reject", params: any);
@ -7,6 +8,18 @@ const emit = defineEmits<{
}>();
const show = ref(false);
const toolsData = ref({} as any);
async function getData(){
const res=await getToolsCount();
toolsData.value=res.data || {};
if(!JSON.parse(res.message)){
showModal();
}
}
onMounted(()=>{
getData()
})
function showModal() {
show.value = true;
@ -27,6 +40,8 @@ async function viewRepeat(e: MouseEvent) {
closeModal();
}
defineExpose({
showModal,
});
@ -43,17 +58,17 @@ defineExpose({
<div class="flex_box" style="height: 100px">
<div class="item">
<SvgIcon name="task_count" width="80" height="96" />
<div class="num_box">6399</div>
<div class="num_box">{{ toolsData?.taskTotal || 0 }}</div>
<div class="title_box">任务总数</div>
</div>
<div class="item">
<SvgIcon name="task_wait" width="80" height="96" />
<div class="num_box">6290</div>
<div class="num_box">{{ toolsData?.treat || 0 }}</div>
<div class="title_box">待审批</div>
</div>
<div class="item">
<SvgIcon name="task_over" width="80" height="96" />
<div class="num_box">109</div>
<div class="num_box">{{ toolsData?.approved || 0 }}</div>
<div class="title_box">已审批</div>
</div>
</div>

@ -1,257 +1,327 @@
<script lang="ts" setup>
import { reactive, ref } from 'vue'
import { useMessage } from 'naive-ui'
import { forgetPassword, getCode, updateSUser } from '@/api/login/login'
import { reactive, ref } from "vue";
import { useMessage } from "naive-ui";
import { forgetPassword, getCode, updateSUser } from "@/api/login/login";
const emit = defineEmits(['close', 'forget'])
const emit = defineEmits(["close", "forget"]);
interface FormState {
enterprisecode?: string
username: string
password: string
captcha: string
enterprisecode?: string;
username: string;
password: string;
captcha: string;
}
interface FormForget {
agentcode: string
loginname: string
phone: string
phonecode: string
agentcode: string;
loginname: string;
phone: string;
phonecode: string;
}
interface FormSure {
newPassword: string
rePasswrod: string
loginname: string
newPassword: string;
rePasswrod: string;
loginname: string;
}
const formRef = ref()
const formRefSure = ref()
const formRef = ref();
const formRefSure = ref();
const message = useMessage()
const loading = ref(false)
const flag = ref(true)
const message = useMessage();
const loading = ref(false);
const flag = ref(true);
const formForget: FormForget = reactive({
agentcode: '',
loginname: '',
phone: '',
phonecode: '',
})
agentcode: "",
loginname: "",
phone: "",
phonecode: "",
});
const formInline: FormState = reactive({
enterprisecode: '',
username: '',
password: '',
captcha: '',
})
enterprisecode: "",
username: "",
password: "",
captcha: "",
});
const formSure: FormSure = reactive({
newPassword: '',
rePasswrod: '',
loginname: '13311111111',
})
const tab = ref(0)
const countTime = ref('获取验证码')
newPassword: "",
rePasswrod: "",
loginname: "13311111111",
});
const tab = ref(0);
const countTime = ref("获取验证码");
const rules = {
enterprisecode: { required: true, message: '请输入企业编码', trigger: 'blur' },
loginname: { required: true, message: '请输入用户名', trigger: 'blur' },
password: { required: true, message: '请输入密码', trigger: 'blur' },
phonecode: { required: true, message: '请输入验证码', trigger: 'blur' },
newPassword: { required: true, message: '请输入新密码', trigger: 'blur' },
enterprisecode: { required: true, message: "请输入企业编码", trigger: "blur" },
agentcode: { required: true, message: "请输入企业编码", trigger: "blur" },
loginname: { required: true, message: "请输入用户名", trigger: "blur" },
phone: { required: true, message: "请输入手机号", trigger: "blur" },
password: { required: true, message: "请输入密码", trigger: "blur" },
phonecode: { required: true, message: "请输入验证码", trigger: "blur" },
newPassword: { required: true, message: "请输入新密码", trigger: "blur" },
rePasswrod: [
{
required: true,
message: '请再次输入密码',
trigger: ['input', 'blur'],
message: "请再次输入密码",
trigger: ["input", "blur"],
},
{
validator: validatePasswordSame,
message: '两次密码输入不一致',
trigger: ['blur', 'password-input'],
message: "两次密码输入不一致",
trigger: ["blur", "password-input"],
},
],
}
};
function validatePasswordSame(rule: any, value: string): boolean {
return value === formSure.newPassword
return value === formSure.newPassword;
}
function handleSubmit(e) {
e.preventDefault()
e.preventDefault();
formRef.value.validate(async (errors) => {
if (!errors) {
const { loginname, phone, phonecode, agentcode } = formForget
loading.value = true
const { loginname, phone, phonecode, agentcode } = formForget;
loading.value = true;
const params = {
loginname,
phone,
phonecode,
agentcode,
}
};
try {
const res = await forgetPassword(params)
if (res.code === 'OK') {
formSure.loginname = res.data.loginname
tab.value = 1
const res = await forgetPassword(params);
if (res.code === "OK") {
formSure.loginname = res.data?.loginname;
tab.value = 1;
}else{
message.error(res.message);
}
} finally {
loading.value = false;
}
finally {
loading.value = false
}
} else {
message.error("请填写完整信息");
}
else {
message.error('请填写完整信息')
}
})
});
}
function handleSure(e) {
e.preventDefault()
e.preventDefault();
formRefSure.value.validate(async (errors) => {
if (!errors) {
const { newPassword, rePasswrod, loginname } = formSure
loading.value = true
const { newPassword, rePasswrod, loginname } = formSure;
loading.value = true;
const params = {
newPassword,
rePasswrod,
loginname,
}
};
try {
const res = await updateSUser(params)
if (res.code === 'OK')
message.success('修改成功')
else
message.error(res.message)
}
finally {
loading.value = false
const res = await updateSUser(params);
if (res.code === "OK") message.success("修改成功");
else message.error(res.message);
} finally {
loading.value = false;
}
} else {
message.error("请填写完整信息");
}
else {
message.error('请填写完整信息')
}
})
});
}
function close() {
emit('close')
loading.value = false;
emit("close");
}
function switchTab(type: number) {
tab.value = type
tab.value = type;
}
function computedForm() {
return !formInline.enterprisecode || !formInline.username || !formInline.password
return !formInline.enterprisecode || !formInline.username || !formInline.password;
}
function computedFormSure() {
return !formSure.newPassword || !formSure.rePasswrod
return !formSure.newPassword || !formSure.rePasswrod;
}
async function sendCode(value) {
if (!flag.value)
return
flag.value = false
if (!flag.value) return;
flag.value = false;
const res = await getCode({
phone: '',
agentcode: '',
})
startCount()
phone: formForget.phone,
agentcode: formForget.agentcode,
});
if (!res.data) {
message.error(res.message);
return;
}
startCount();
}
function startCount() {
let time = 60
countTime.value = '60s'
let time = 60;
countTime.value = "60s";
const timer = setInterval(() => {
countTime.value = `${--time}s`
countTime.value = `${--time}s`;
if (time === 0) {
clearInterval(timer)
countTime.value = '获取验证码'
flag.value = true
clearInterval(timer);
countTime.value = "获取验证码";
flag.value = true;
}
}, 1000)
}, 1000);
}
function forget() {
emit('forget')
loading.value = false;
emit("forget");
}
</script>
<template>
<div class="form-login">
<img class="img-close" src="@/assets/images/login/close.png" alt="" @click="close">
<div class="header flex justify-between">
<div class="tab">
忘记密码
</div>
<div class="back" @click="forget">
&lt; 返回登录
</div>
<img class="img-close" src="@/assets/images/login/close.png" alt="" @click="close" />
<div class="flex justify-between header">
<div class="tab">忘记密码</div>
<div class="back" @click="forget">&lt; </div>
</div>
<div v-if="tab === 0" class="form-1">
<n-form ref="formRef" label-placement="left" size="large" :model="formForget" :rules="rules">
<n-form
ref="formRef"
label-placement="left"
size="large"
:model="formForget"
:rules="rules"
>
<n-form-item class="form-item" path="agentcode">
<n-input v-model:value="formForget.agentcode" class="item-input" placeholder="请输入企业编码">
<n-input
v-model:value="formForget.agentcode"
class="item-input"
placeholder="请输入企业编码"
>
<template #prefix>
<svg-icon size="20" name="enterprise" />
</template>
</n-input>
</n-form-item>
<n-form-item class="form-item" path="loginname">
<n-input v-model:value="formForget.loginname" class="item-input" placeholder="请输入用户名">
<n-input
v-model:value="formForget.loginname"
class="item-input"
placeholder="请输入用户名"
>
<template #prefix>
<svg-icon size="20" name="account" />
</template>
</n-input>
</n-form-item>
<n-form-item class="form-item" path="phone">
<n-input v-model:value="formForget.phone" class="item-input" placeholder="请输入手机号">
<n-input
v-model:value="formForget.phone"
class="item-input"
placeholder="请输入手机号"
>
<template #prefix>
<img class="img-phone" src="@/assets/images/login/phone.png" alt="" @click="close">
<img
class="img-phone"
src="@/assets/images/login/phone.png"
alt=""
@click="close"
/>
</template>
</n-input>
</n-form-item>
<n-form-item class="form-item" path="phonecode">
<n-input v-model:value="formForget.phonecode" maxlength="6" class="item-input" placeholder="请输入验证码" clearable>
<n-input
v-model:value="formForget.phonecode"
maxlength="6"
class="item-input"
placeholder="请输入验证码"
clearable
>
<template #prefix>
<img class="img-phone" src="@/assets/images/login/auth.png" alt="" @click="close">
<img
class="img-phone"
src="@/assets/images/login/auth.png"
alt=""
@click="close"
/>
</template>
<template #suffix>
<div :class="{ 'code-count': countTime !== '获取验证码' }" class="code" @click="sendCode">
<div
:class="{ 'code-count': countTime !== '获取验证码' }"
class="code"
@click="sendCode"
>
{{ countTime }}
</div>
</template>
</n-input>
</n-form-item>
<n-form-item class="form-item">
<n-button :class="{ 'btn-disabled': computedForm() }" class="btn" type="primary" size="large" :loading="loading" block @click="handleSubmit">
<n-button
:class="{ 'btn-disabled': computedForm() }"
class="btn"
type="primary"
size="large"
:loading="loading"
block
@click="handleSubmit"
>
下一步
</n-button>
</n-form-item>
</n-form>
</div>
<div v-if="tab === 1" class="form-1">
<n-form ref="formRefSure" label-placement="left" size="large" :model="formSure" :rules="rules">
<n-form
ref="formRefSure"
label-placement="left"
size="large"
:model="formSure"
:rules="rules"
>
<n-form-item class="form-item" path="newPassword">
<n-input v-model:value="formSure.newPassword" class="item-input" type="password" show-password-on="click" placeholder="请输入8-16位密码必须包含英文及数字">
<n-input
v-model:value="formSure.newPassword"
class="item-input"
type="password"
show-password-on="click"
placeholder="请输入8-16位密码必须包含英文及数字"
>
<template #prefix>
<svg-icon size="20" name="password" />
</template>
</n-input>
</n-form-item>
<n-form-item class="form-item" path="rePasswrod">
<n-input v-model:value="formSure.rePasswrod" class="item-input" type="password" show-password-on="click" placeholder="请再次确认输入新密码">
<n-input
v-model:value="formSure.rePasswrod"
class="item-input"
type="password"
show-password-on="click"
placeholder="请再次确认输入新密码"
>
<template #prefix>
<svg-icon size="20" name="password" />
</template>
</n-input>
</n-form-item>
<n-form-item class="form-item">
<n-button :class="{ 'btn-disabled': computedFormSure() }" class="btn" type="primary" size="large" :loading="loading" block @click="handleSure">
<n-button
:class="{ 'btn-disabled': computedFormSure() }"
class="btn"
type="primary"
size="large"
:loading="loading"
block
@click="handleSure"
>
确定
</n-button>
</n-form-item>
@ -264,15 +334,19 @@ function forget() {
.form-login {
width: 420px;
box-sizing: border-box;
background: linear-gradient(136deg,rgba(226,236,255,0.80) 3%, rgba(251,251,251,0.80) 97%);
background: linear-gradient(
136deg,
rgba(226, 236, 255, 0.8) 3%,
rgba(251, 251, 251, 0.8) 97%
);
border: 1px solid #ffffff;
border-radius: 6px;
box-shadow: 0px 6px 12px 0px rgba(0,0,0,0.04);
box-shadow: 0px 6px 12px 0px rgba(0, 0, 0, 0.04);
backdrop-filter: blur(12px);
position: relative;
padding: 48px 27px 42px;
.img-close{
.img-close {
position: absolute;
right: 0;
top: -44px;
@ -281,7 +355,7 @@ function forget() {
cursor: pointer;
}
.tab{
.tab {
font-size: 24px;
font-family: PingFang SC, PingFang SC-Medium;
font-weight: Medium;
@ -289,59 +363,59 @@ function forget() {
color: #507afd;
}
.header{
.header {
align-items: center;
}
.form-1{
.form-1 {
margin-top: 29px;
.form-item{
.form-item {
height: 60px;
}
.item-input{
.item-input {
width: 366px;
// height: 44px;
background: rgba(255,255,255,0.50);
background: rgba(255, 255, 255, 0.5);
border-radius: 4px;
}
.btn{
.btn {
width: 366px;
height: 44px;
background: linear-gradient(234deg,#96aaff 0%, #1c43ff 100%);
background: linear-gradient(234deg, #96aaff 0%, #1c43ff 100%);
border-radius: 3px;
margin-top: 10px;
margin-bottom: 14px;
&-disabled{
&-disabled {
opacity: 0.5;
background: linear-gradient(234deg,#96aaff 0%, #1c43ff 100%);
background: linear-gradient(234deg, #96aaff 0%, #1c43ff 100%);
}
}
}
.img-phone{
.img-phone {
width: 20px;
height: 20px;
}
.order-last{
.order-last {
font-size: 14px;
font-family: PingFang SC, PingFang SC-Regular;
font-weight: Regular;
color: #507afd;
}
.code{
.code {
font-size: 15px;
font-family: PingFang SC, PingFang SC-Regular;
font-weight: Regular;
color: #507afd;
margin-left: 12px;
&-count{
&-count {
font-size: 14px;
color: #999999;
}
@ -350,4 +424,12 @@ function forget() {
::v-deep(.n-form-item-feedback--error) {
// color: #FF4E4F !important;
}
.back {
font-size: 15px;
font-family: PingFang SC, PingFang SC-Medium;
font-weight: Medium;
text-align: center;
color: #666666;
line-height: 21px;
}
</style>

@ -1,239 +1,268 @@
<script lang="ts" setup>
import { computed, reactive, ref } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { useMessage } from 'naive-ui'
import { computed, reactive, ref } from "vue";
import { useRoute, useRouter } from "vue-router";
import { useMessage } from "naive-ui";
// import captcha from './captcha.vue'
import { PageEnum } from '@/enums/pageEnum'
import { useUserStore } from '@/store/modules/user'
import { ResultEnum } from '@/enums/httpEnum'
import { getCode, smsLogin } from '@/api/login/login'
import { PageEnum } from "@/enums/pageEnum";
import { useUserStore } from "@/store/modules/user";
import { ResultEnum } from "@/enums/httpEnum";
import { getCode, smsLogin } from "@/api/login/login";
const emit = defineEmits(['close', 'forget'])
const emit = defineEmits(["close", "forget"]);
interface FormState {
enterprisecode?: string
username: string
password: string
enterprisecode?: string;
username: string;
password: string;
}
interface FormSms {
agentcode: string
phone: string
phonecode: string
agentcode: string;
phone: string;
phonecode: string;
}
const formRef = ref()
const formRefSms = ref()
const message = useMessage()
const loading = ref(false)
const autoLogin = ref(true)
const LOGIN_NAME = PageEnum.BASE_LOGIN_NAME
const userStore = useUserStore()
const router = useRouter()
const route = useRoute()
const show = ref(false)
const flag = ref(true)
const formRef = ref();
const formRefSms = ref();
const message = useMessage();
const loading = ref(false);
const autoLogin = ref(true);
const LOGIN_NAME = PageEnum.BASE_LOGIN_NAME;
const userStore = useUserStore();
const router = useRouter();
const route = useRoute();
const show = ref(false);
const flag = ref(true);
const formInline: FormState = reactive({
// enterprisecode: '',
// username: 'yanshi01',
// password: '123456',
// enterprisecode: "",
// username: "yanshi01",
// password: "123456",
enterprisecode: '',
username: '',
password: '',
})
});
const formSms: FormSms = reactive({
agentcode: '',
phone: '',
phonecode: '',
})
const tab = ref(0)
const countTime = ref('获取验证码')
agentcode: "",
phone: "",
phonecode: "",
});
const tab = ref(0);
const countTime = ref("获取验证码");
const rules = {
enterprisecode: { required: true, message: '请输入企业编码', trigger: 'blur' },
agentcode: { required: true, message: '请输入企业编码', trigger: 'blur' },
phone: { required: true, message: '请输入手机号', trigger: 'blur' },
phonecode: { required: true, message: '请输入验证码', trigger: 'blur' },
username: { required: true, message: '请输入用户名', trigger: 'blur' },
password: { required: true, message: '请输入密码', trigger: 'blur' },
captcha: { required: true, message: '请输入验证码', trigger: 'blur' },
}
enterprisecode: { required: true, message: "请输入企业编码", trigger: "blur" },
agentcode: { required: true, message: "请输入企业编码", trigger: "blur" },
phone: { required: true, message: "请输入手机号", trigger: "blur" },
phonecode: { required: true, message: "请输入验证码", trigger: "blur" },
username: { required: true, message: "请输入用户名", trigger: "blur" },
password: { required: true, message: "请输入密码", trigger: "blur" },
captcha: { required: true, message: "请输入验证码", trigger: "blur" },
};
function handleSubmit(e) {
e.preventDefault()
e.preventDefault();
formRef.value.validate(async (errors) => {
if (!errors) {
const { username, password, enterprisecode } = formInline
message.loading('登录中...')
loading.value = true
const { username, password, enterprisecode } = formInline;
message.loading("登录中...");
loading.value = true;
const params = {
username,
password,
codetoken: userStore.getCapToken,
agentcode: enterprisecode,
}
};
try {
const { code, message: msg } = await userStore.login(params)
const { code, message: msg } = await userStore.login(params);
if (code === ResultEnum.SUCCESS) {
await userStore.getInformation()
message.destroyAll()
const toPath = decodeURIComponent((route.query?.redirect || '/') as string)
message.success('登录成功,即将进入系统')
if (route.name === LOGIN_NAME)
router.replace('/')
else router.replace(toPath)
}
else {
message.destroyAll()
message.info(msg || '登录失败')
await userStore.getInformation();
message.destroyAll();
const toPath = decodeURIComponent((route.query?.redirect || "/") as string);
message.success("登录成功,即将进入系统");
if (route.name === LOGIN_NAME) router.replace("/");
else router.replace(toPath);
} else {
message.destroyAll();
message.info(msg || "登录失败");
}
} finally {
loading.value = false;
}
finally {
loading.value = false
}
}
else {
message.error('请填写完整信息,并且进行验证码校验')
} else {
message.error("请填写完整信息,并且进行验证码校验");
}
})
});
}
function handleSmsSubmit(e) {
e.preventDefault()
e.preventDefault();
formRefSms.value.validate(async (errors) => {
if (!errors) {
const { phone, agentcode, phonecode } = formSms
message.loading('登录中...')
loading.value = true
const { phone, agentcode, phonecode } = formSms;
message.loading("登录中...");
loading.value = true;
try {
const res = await smsLogin({
phone,
agentcode,
phonecode,
})
const { code, message: msg } = res
});
const { code, message: msg } = res;
if (code === ResultEnum.SUCCESS) {
// const { code, message: msg } = await userStore.login(params)
await userStore.getInformation()
message.destroyAll()
const toPath = decodeURIComponent((route.query?.redirect || '/') as string)
message.success('登录成功,即将进入系统')
if (route.name === LOGIN_NAME)
router.replace('/')
else router.replace(toPath)
// const { code, message: msg } = await userStore.login(params)
await userStore.getInformation();
message.destroyAll();
const toPath = decodeURIComponent((route.query?.redirect || "/") as string);
message.success("登录成功,即将进入系统");
if (route.name === LOGIN_NAME) router.replace("/");
else router.replace(toPath);
} else {
message.destroyAll();
message.info(msg || "登录失败");
}
else {
message.destroyAll()
message.info(msg || '登录失败')
}
}
finally {
loading.value = false
} finally {
loading.value = false;
}
} else {
message.error("请填写完整信息,并且进行验证码校验");
}
else {
message.error('请填写完整信息,并且进行验证码校验')
}
})
});
}
function close() {
emit('close')
loading.value = false;
emit("close");
}
function switchTab(type: number) {
tab.value = type
loading.value = false;
tab.value = type;
}
function computedForm() {
return !formInline.enterprisecode || !formInline.username || !formInline.password
return !formInline.enterprisecode || !formInline.username || !formInline.password;
}
async function sendCode(value) {
if (!formSms.phonecode)
return
if (!formSms.phonecode) return;
if (!flag.value)
return
flag.value = false
if (!flag.value) return;
flag.value = false;
const res = await getCode({
phone: formSms.phone,
agentcode: '',
})
startCount()
agentcode: "",
});
startCount();
}
function startCount() {
let time = 60
countTime.value = '60s'
let time = 60;
countTime.value = "60s";
const timer = setInterval(() => {
countTime.value = `${--time}s`
countTime.value = `${--time}s`;
if (time === 0) {
clearInterval(timer)
countTime.value = '重新获取'
flag.value = true
clearInterval(timer);
countTime.value = "重新获取";
flag.value = true;
}
}, 1000)
}, 1000);
}
function forget() {
emit('forget')
loading.value = false;
emit("forget");
}
</script>
<template>
<div class="form-login">
<img class="img-close" src="@/assets/images/login/close.png" alt="" @click="close">
<img class="img-close" src="@/assets/images/login/close.png" alt="" @click="close" />
<div class="tab">
<div :class="{ 'tab-item-active': tab === 0 }" class="tab-item" @click="switchTab(0)">
<div
:class="{ 'tab-item-active': tab === 0 }"
class="tab-item"
@click="switchTab(0)"
>
密码登录
<div class="line" />
</div>
<div :class="{ 'tab-item-active': tab === 1 }" class="tab-item" @click="switchTab(1)">
<div
:class="{ 'tab-item-active': tab === 1 }"
class="tab-item"
@click="switchTab(1)"
>
短信登录
<div class="line" />
</div>
</div>
<div v-if="tab === 0" class="form-1">
<n-form ref="formRef" label-placement="left" size="large" :model="formInline" :rules="rules">
<n-form
ref="formRef"
label-placement="left"
size="large"
:model="formInline"
:rules="rules"
>
<n-form-item class="form-item" path="enterprisecode">
<n-input v-model:value="formInline.enterprisecode" class="item-input" placeholder="请输入企业编码">
<n-input
v-model:value="formInline.enterprisecode"
class="item-input"
placeholder="请输入企业编码"
>
<template #prefix>
<svg-icon size="20" name="enterprise" />
</template>
</n-input>
</n-form-item>
<n-form-item class="form-item" path="username">
<n-input v-model:value="formInline.username" class="item-input" placeholder="请输入用户名">
<n-input
v-model:value="formInline.username"
class="item-input"
placeholder="请输入用户名"
>
<template #prefix>
<svg-icon size="20" name="account" />
</template>
</n-input>
</n-form-item>
<n-form-item class="form-item" path="password">
<n-input v-model:value="formInline.password" class="item-input" type="password" show-password-on="click" placeholder="请输入密码">
<n-input
v-model:value="formInline.password"
class="item-input"
type="password"
show-password-on="click"
placeholder="请输入密码"
>
<template #prefix>
<svg-icon size="20" name="password" />
</template>
</n-input>
</n-form-item>
<n-form-item class="form-item">
<n-button :class="{ 'btn-disabled': computedForm() }" class="btn" type="primary" size="large" :loading="loading" block @click="handleSubmit">
<n-button
:class="{ 'btn-disabled': computedForm() }"
class="btn"
type="primary"
size="large"
:loading="loading"
block
@click="handleSubmit"
>
登录
</n-button>
</n-form-item>
<n-form-item class="default-color">
<div class="w-full flex justify-between">
<div class="flex justify-between w-full">
<div class="flex-initial">
<n-checkbox v-model:checked="autoLogin">
记住账号
<span class="forgetSpan">记住账号</span>
</n-checkbox>
</div>
<div class="flex-initial order-last" @click="forget">
@ -244,43 +273,85 @@ function forget() {
</n-form>
</div>
<div v-else class="form-1">
<n-form ref="formRefSms" label-placement="left" size="large" :model="formSms" :rules="rules">
<n-form
ref="formRefSms"
label-placement="left"
size="large"
:model="formSms"
:rules="rules"
>
<n-form-item class="form-item" path="agentcode">
<n-input v-model:value="formSms.agentcode" class="item-input" placeholder="请输入企业编码">
<n-input
v-model:value="formSms.agentcode"
class="item-input"
placeholder="请输入企业编码"
>
<template #prefix>
<svg-icon size="20" name="enterprise" />
</template>
</n-input>
</n-form-item>
<n-form-item class="form-item" path="phone">
<n-input v-model:value="formSms.phone" class="item-input" placeholder="请输入手机号">
<n-input
v-model:value="formSms.phone"
class="item-input"
placeholder="请输入手机号"
>
<template #prefix>
<img class="img-phone" src="@/assets/images/login/phone.png" alt="" @click="close">
<img
class="img-phone"
src="@/assets/images/login/phone.png"
alt=""
@click="close"
/>
</template>
</n-input>
</n-form-item>
<n-form-item class="form-item" path="phonecode">
<n-input v-model:value="formSms.phonecode" maxlength="6" class="item-input" placeholder="请输入验证码" clearable>
<n-input
v-model:value="formSms.phonecode"
maxlength="6"
class="item-input"
placeholder="请输入验证码"
clearable
>
<template #prefix>
<img class="img-phone" src="@/assets/images/login/auth.png" alt="" @click="close">
<img
class="img-phone"
src="@/assets/images/login/auth.png"
alt=""
@click="close"
/>
</template>
<template #suffix>
<div :class="{ 'code-count': countTime !== '获取验证码' }" class="code" @click="sendCode">
<div
:class="{ 'code-count': countTime !== '获取验证码' }"
class="code"
@click="sendCode"
>
{{ countTime }}
</div>
</template>
</n-input>
</n-form-item>
<n-form-item class="form-item">
<n-button :class="{ 'btn-disabled': computedForm() }" class="btn" type="primary" size="large" :loading="loading" block @click="handleSmsSubmit">
<n-button
:class="{ 'btn-disabled': computedForm() }"
class="btn"
type="primary"
size="large"
:loading="loading"
block
@click="handleSmsSubmit"
>
登录
</n-button>
</n-form-item>
<n-form-item class="default-color">
<div class="w-full flex justify-between">
<div class="flex justify-between w-full">
<div class="flex-initial">
<n-checkbox v-model:checked="autoLogin">
记住账号
<span class="forgetSpan">记住账号</span>
</n-checkbox>
</div>
<div class="flex-initial order-last" @click="forget">
@ -298,15 +369,19 @@ function forget() {
width: 420px;
height: 417px;
box-sizing: border-box;
background: linear-gradient(136deg,rgba(226,236,255,0.80) 3%, rgba(251,251,251,0.80) 97%);
background: linear-gradient(
136deg,
rgba(226, 236, 255, 0.8) 3%,
rgba(251, 251, 251, 0.8) 97%
);
border: 1px solid #ffffff;
border-radius: 6px;
box-shadow: 0px 6px 12px 0px rgba(0,0,0,0.04);
box-shadow: 0px 6px 12px 0px rgba(0, 0, 0, 0.04);
backdrop-filter: blur(12px);
position: relative;
padding: 48px 27px 0;
.img-close{
.img-close {
position: absolute;
right: 0;
top: -44px;
@ -315,9 +390,9 @@ function forget() {
cursor: pointer;
}
.tab{
.tab {
display: flex;
.tab-item{
.tab-item {
width: 72px;
height: 25px;
font-size: 18px;
@ -328,7 +403,7 @@ function forget() {
line-height: 33px;
margin-right: 24px;
&-active{
&-active {
width: 96px;
height: 33px;
font-size: 24px;
@ -338,12 +413,12 @@ function forget() {
color: #507afd;
line-height: 33px;
.line{
background: linear-gradient(234deg,#96aaff 0%, #1c43ff 100%);
.line {
background: linear-gradient(234deg, #96aaff 0%, #1c43ff 100%);
}
}
.line{
.line {
width: 32px;
height: 4px;
border-radius: 2px;
@ -353,55 +428,55 @@ function forget() {
}
}
.form-1{
.form-1 {
margin-top: 29px;
.form-item{
.form-item {
height: 60px;
}
.item-input{
.item-input {
width: 366px;
// height: 44px;
background: rgba(255,255,255,0.50);
background: rgba(255, 255, 255, 0.5);
border-radius: 4px;
}
.btn{
.btn {
width: 366px;
height: 44px;
background: linear-gradient(234deg,#96aaff 0%, #1c43ff 100%);
background: linear-gradient(234deg, #96aaff 0%, #1c43ff 100%);
border-radius: 3px;
margin-top: 10px;
margin-bottom: 14px;
&-disabled{
&-disabled {
opacity: 0.5;
background: linear-gradient(234deg,#96aaff 0%, #1c43ff 100%);
background: linear-gradient(234deg, #96aaff 0%, #1c43ff 100%);
}
}
}
.img-phone{
.img-phone {
width: 20px;
height: 20px;
}
.order-last{
.order-last {
font-size: 14px;
font-family: PingFang SC, PingFang SC-Regular;
font-weight: Regular;
color: #507afd;
}
.code{
.code {
font-size: 15px;
font-family: PingFang SC, PingFang SC-Regular;
font-weight: Regular;
color: #507afd;
margin-left: 12px;
&-count{
&-count {
font-size: 14px;
color: #999999;
}
@ -410,4 +485,12 @@ function forget() {
::v-deep(.n-form-item-feedback--error) {
// color: #FF4E4F !important;
}
.forgetSpan {
font-size: 15px;
font-family: PingFang SC, PingFang SC-Regular;
font-weight: Regular;
text-align: center;
color: #999999;
line-height: 21px;
}
</style>

@ -321,6 +321,10 @@ const currentTaskId = computed(() => {
function overTaskHandle() {
const item = taskDetailInfo.value
if (item?.userapprove?.statshis === 2 || item?.userapprove?.statshis == 3) {
overTask.value = null;
return;
}
if (validate([item]) == null && batch.value === false)
overTask.value = item

@ -7,7 +7,7 @@ import imagesloaded from "imagesloaded";
import ConfrimModal from "../modal/ConfrimModal.vue";
import type { PictureSortParam, SetTFParam } from "/#/api";
import { useWorkOrder } from "@/store/modules/workOrder";
import { formatToDateHMS } from '@/utils/dateUtil'
import { formatToDateHMS } from "@/utils/dateUtil";
import {
clearTF,
getPackageTaskList,
@ -341,6 +341,11 @@ async function clearMark() {
}
function overTaskHandelr(item: any) {
if (item?.userapprove?.statshis === 2 || item?.userapprove?.statshis == 3) {
overTask.value = null;
return;
}
if (validate([item]) == null && batch.value === false) overTask.value = item;
}
@ -455,9 +460,9 @@ function previewHandler(event: MouseEvent) {
/>
</div>
<div class="time">
<SvgIcon color="#FFF" size="16" name="time" />
<span>{{ formatToDateHMS(taskDetailInfo.createdate || 0) }}</span>
</div>
<SvgIcon color="#FFF" size="16" name="time" />
<span>{{ formatToDateHMS(taskDetailInfo.createdate || 0) }}</span>
</div>
<!-- 右下信息 -->
<div class="info">
<n-grid x-gap="16" y-gap="0" :cols="12">
@ -579,6 +584,10 @@ function previewHandler(event: MouseEvent) {
class="img-wrapper"
:style="{ 'background-image': `url(${item.thumburl})` }"
/>
<div class="time">
<SvgIcon color="#FFF" size="16" name="time" />
<span>{{ formatToDateHMS(item.createdate || 0) }}</span>
</div>
<div class="check">
<n-checkbox
v-show="batch"
@ -923,12 +932,12 @@ function previewHandler(event: MouseEvent) {
}
.time {
position: absolute;
z-index: 3;
left: 2%;
bottom: 2%;
color: #fff;
display: flex;
align-items: center;
}
position: absolute;
z-index: 3;
left: 5%;
bottom: 5%;
color: #fff;
display: flex;
align-items: center;
}
</style>

Loading…
Cancel
Save