修复detail添加两件相同的sketch会有问题,优化教育版管理员页面

This commit is contained in:
X1627315083
2025-09-10 16:33:40 +08:00
parent 1d524eeef9
commit 7e6a3b1144
14 changed files with 62 additions and 53 deletions

View File

@@ -111,10 +111,12 @@ import { Modal, message } from "ant-design-vue";
import { ExclamationCircleOutlined } from "@ant-design/icons-vue"; import { ExclamationCircleOutlined } from "@ant-design/icons-vue";
import { formatTime, isEmail } from "@/tool/util"; import { formatTime, isEmail } from "@/tool/util";
import md5 from "md5"; import md5 from "md5";
import { useI18n } from 'vue-i18n'
export default defineComponent({ export default defineComponent({
components: {}, components: {},
emits: ["searchHistoryList"], emits: ["searchHistoryList"],
setup(props, { emit }) { setup(props, { emit }) {
const {t} = useI18n()
let operations = reactive({ let operations = reactive({
operationsModal: false, operationsModal: false,
operationsEdit: false, operationsEdit: false,
@@ -183,7 +185,7 @@ export default defineComponent({
return { return {
creditsUsageLimit: operationsData.credits, creditsUsageLimit: operationsData.credits,
userEmail: operationsData.userEmail, userEmail: operationsData.userEmail,
userPassword: md5(operationsData.password + "abc"), userPassword: operationsData.password?md5(operationsData.password + "abc"):'',
userName: operationsData.userName, userName: operationsData.userName,
}; };
}; };

View File

@@ -30,7 +30,7 @@
<div class="admin_state_item"> <div class="admin_state_item">
<span>User Name: <span>*</span></span> <span>User Name: <span>*</span></span>
<input <input
:readonly="title != 'Add'" :disabled="title != 'Add'"
:class="{active:title != 'Add'}" :class="{active:title != 'Add'}"
v-model="userName" v-model="userName"
placeholder="Please enter user name" placeholder="Please enter user name"
@@ -41,7 +41,7 @@
<div class="admin_state_item"> <div class="admin_state_item">
<span>User Email: <span>*</span></span> <span>User Email: <span>*</span></span>
<input <input
:readonly="title != 'Add'" :disabled="title != 'Add'"
:class="{active:title != 'Add'}" :class="{active:title != 'Add'}"
v-model="userEmail" v-model="userEmail"
placeholder="Please enter email" placeholder="Please enter email"
@@ -94,7 +94,7 @@
<div class="admin_state_item"> <div class="admin_state_item">
<span>Country:</span> <span>Country:</span>
<input <input
:readonly="title != 'Add'" :disabled="title != 'Add'"
:class="{active:title != 'Add'}" :class="{active:title != 'Add'}"
v-model="country" v-model="country"
placeholder="Please enter country" placeholder="Please enter country"
@@ -105,7 +105,7 @@
<div class="admin_state_item"> <div class="admin_state_item">
<span>Organization Name:</span> <span>Organization Name:</span>
<input <input
:readonly="title != 'Add'" :disabled="title != 'Add'"
:class="{active:title != 'Add'}" :class="{active:title != 'Add'}"
v-model="organizationName" v-model="organizationName"
placeholder="Please enter Organization Name" placeholder="Please enter Organization Name"
@@ -116,7 +116,7 @@
<div class="admin_state_item"> <div class="admin_state_item">
<span>Sub Account Num:</span> <span>Sub Account Num:</span>
<input <input
:readonly="title != 'Add'" :disabled="title != 'Add'"
:class="{active:title != 'Add'}" :class="{active:title != 'Add'}"
v-model="subAccountNum" v-model="subAccountNum"
placeholder="Please enter Sub Account Num" placeholder="Please enter Sub Account Num"

View File

@@ -107,7 +107,7 @@ export default defineComponent({
canvasLoad:false, canvasLoad:false,
canvasConfig:{ canvasConfig:{
} as any, } as any,
currentView:'canvasEditor', currentView:'',
getCanvasIfEdit:inject('getCanvasIfEdit')as any, getCanvasIfEdit:inject('getCanvasIfEdit')as any,
canvasInstance:null as any, canvasInstance:null as any,
canvasJSON:'', canvasJSON:'',
@@ -271,6 +271,7 @@ export default defineComponent({
}) })
onMounted(()=>{ onMounted(()=>{
nextTick(async ()=>{ nextTick(async ()=>{
detailData.currentView = 'canvasEditor'
if(detailData.selectDetail.canvasId){ if(detailData.selectDetail.canvasId){
detailData.isShowMark = true detailData.isShowMark = true
await new Promise((resolve, reject) => { await new Promise((resolve, reject) => {

View File

@@ -138,11 +138,6 @@ export default defineComponent({
default:'' as any, default:'' as any,
required:true required:true
}, },
isSegmentation:{
type:Boolean,
default:false as any,
required:true
},
}, },
emits:['selectImgItem'], emits:['selectImgItem'],
setup(props,{emit}) { setup(props,{emit}) {
@@ -154,7 +149,6 @@ export default defineComponent({
designTypeList:computed(()=>props.catecoryList) as any, designTypeList:computed(()=>props.catecoryList) as any,
designType:'', designType:'',
searchPictureName:'', searchPictureName:'',
designDetail:computed(()=>store.state.DesignDetail.designDetail),
mannequinData:{ mannequinData:{
sex:'Female', sex:'Female',
style:'', style:'',
@@ -188,36 +182,10 @@ export default defineComponent({
detailData.designType = detailData.designTypeList[0]?.value?detailData.designTypeList[0]?.value:'' detailData.designType = detailData.designTypeList[0]?.value?detailData.designTypeList[0]?.value:''
getLibraryList() getLibraryList()
} }
const hasDuplicateId = (id:any)=>{
let arr = detailData.designDetail.clothes
for (let i = 0; i < arr.length; i++) {
if (arr[i].id === id) {
return true;
}
}
return false;
}
const selectImgItem = (file:any)=>{ const selectImgItem = (file:any)=>{
let randomNum = Math.floor(100 + Math.random() * 900);
let type = props.type
// let type = store.state.DesignDetail.currentDetailType
let id = file.id
if(type == 'sketch'){
id = Number(file.id + (randomNum + ''))
if(props.randomId){
if(hasDuplicateId(id)){
selectImgItem(file)
return
}
}
}
let data = JSON.parse(JSON.stringify(file)) let data = JSON.parse(JSON.stringify(file))
data.type = detailData.mannequinData.system == 'system'?'System':'Library' data.type = detailData.mannequinData.system == 'system'?'System':'Library'
if(!props.isSegmentation){
data.id = id
}
emit('selectImgItem',data) emit('selectImgItem',data)
// store.commit('DesignDetail/setNewDetail',data)
} }
const getLibraryList = ()=>{ const getLibraryList = ()=>{
if(props.type == 'models'){ if(props.type == 'models'){
@@ -260,7 +228,6 @@ export default defineComponent({
detailData.isShowLoading = true detailData.isShowLoading = true
let level2Type = '' let level2Type = ''
let workspace = store.state.Workspace.probjects let workspace = store.state.Workspace.probjects
// let type = store.state.DesignDetail.currentDetailType
let data = { let data = {
level1Type:props.level1Type, level1Type:props.level1Type,
// level2Type:'Pattern', // level2Type:'Pattern',

View File

@@ -37,7 +37,7 @@
<uploadSegmentation v-if="isSegmentation" :segmentationType="segmentationType" :deReconstructionList=deReconstructionList @selectImgItem="selectImgItem" :level1Type="level1Type" :catecoryList="catecoryList"></uploadSegmentation> <uploadSegmentation v-if="isSegmentation" :segmentationType="segmentationType" :deReconstructionList=deReconstructionList @selectImgItem="selectImgItem" :level1Type="level1Type" :catecoryList="catecoryList"></uploadSegmentation>
</div> </div>
<div class="content_item" v-show="selectTitle == 'library'"> <div class="content_item" v-show="selectTitle == 'library'">
<libraryList :isSegmentation="isSegmentation" @selectImgItem="selectImgItem" :randomId="randomId" :level1Type="level1Type" :type="type" ref="libraryList" :catecoryList="catecoryList"></libraryList> <libraryList @selectImgItem="selectImgItem" :randomId="randomId" :level1Type="level1Type" :type="type" ref="libraryList" :catecoryList="catecoryList"></libraryList>
</div> </div>
</div> </div>
</div> </div>
@@ -121,7 +121,9 @@ export default defineComponent({
detailData.selectTitle = 'library' detailData.selectTitle = 'library'
getDetailListDom.libraryList.init() getDetailListDom.libraryList.init()
} }
const selectImgItem = (data:any)=>{ const selectImgItem = (data:any)=>{
emit('selectImgItem',data) emit('selectImgItem',data)
} }
onMounted(()=>{ onMounted(()=>{

View File

@@ -35,6 +35,7 @@ export default defineComponent({
const detailData = reactive({ const detailData = reactive({
selectTitle:'current', selectTitle:'current',
selectDetail:computed(()=>store.state.DesignDetail.selectDetail), selectDetail:computed(()=>store.state.DesignDetail.selectDetail),
designDetail:computed(()=>store.state.DesignDetail.designDetail),
sketchCatecoryList:computed(()=>{ sketchCatecoryList:computed(()=>{
return store.state.Workspace.probjects.positionList return store.state.Workspace.probjects.positionList
}), }),
@@ -58,8 +59,24 @@ export default defineComponent({
detailData.selectTitle = 'library' detailData.selectTitle = 'library'
getDetailListDom.libraryList.init() getDetailListDom.libraryList.init()
} }
const hasDuplicateId = (id:any)=>{
let arr = detailData.designDetail.clothes
for (let i = 0; i < arr.length; i++) {
if (arr[i].id === id) {
return true;
}
}
return false;
}
const selectImgItem = (data:any)=>{ const selectImgItem = (data:any)=>{
console.log(data) let randomNum = Math.floor(100 + Math.random() * 900);
let id = data.id
id = Number(data.id + (randomNum + ''))
if(hasDuplicateId(id)){
selectImgItem(data)
return
}
data.id = id
if(data?.imgUrl)data.url = data.imgUrl if(data?.imgUrl)data.url = data.imgUrl
let value = { let value = {
data, data,

View File

@@ -14,7 +14,7 @@
<i v-show="true" class="icon iconfont icon-chehui" @click="revocation"></i> <i v-show="true" class="icon iconfont icon-chehui" @click="revocation"></i>
<i v-show="true" class="icon iconfont icon-fanchehui" @click="oppositeRevocation"></i> <i v-show="true" class="icon iconfont icon-fanchehui" @click="oppositeRevocation"></i>
<!-- 编辑 --> <!-- 编辑 -->
<i class="fi fi-rr-edit" :title="$t('DesignDetail.editTitle')" :class="{active:isEditPattern.value}" @click="showDesignImgDetail('edit')"></i> <i class="fi fi-rr-edit" :title="$t('DesignDetail.editTitle')" :class="{active:isEditPattern.value,'pointerEventsNone':!selectDetail?.id}" @click="showDesignImgDetail('edit')"></i>
<!-- <i class="fi fi-rr-copy" :title="$t('DesignDetail.compareTitle')" :class="{active:imgDesignImg}" @click="mousedownDesignImg"></i> --> <!-- <i class="fi fi-rr-copy" :title="$t('DesignDetail.compareTitle')" :class="{active:imgDesignImg}" @click="mousedownDesignImg"></i> -->
<!-- <i v-show="!body && !deleteShow" :title="$t('DesignDetail.DetailTitle')" class="fi fi-rr-trash" @click="deleteNav(0)"></i> <!-- <i v-show="!body && !deleteShow" :title="$t('DesignDetail.DetailTitle')" class="fi fi-rr-trash" @click="deleteNav(0)"></i>
<i v-show="!body && deleteShow" class="fi fi-br-check" @click="deleteNav(1)"></i> --> <i v-show="!body && deleteShow" class="fi fi-br-check" @click="deleteNav(1)"></i> -->
@@ -48,6 +48,7 @@ export default defineComponent({
const store = useStore(); const store = useStore();
const detailData = reactive({ const detailData = reactive({
getCanvasIfEdit:inject('getCanvasIfEdit')as any, getCanvasIfEdit:inject('getCanvasIfEdit')as any,
selectDetail:computed(()=>store.state.DesignDetail.selectDetail),
}) })
const setRevocation:any = inject('setRevocation') const setRevocation:any = inject('setRevocation')
const getDetailListData = reactive({ const getDetailListData = reactive({
@@ -187,6 +188,11 @@ export default defineComponent({
width: 4rem; width: 4rem;
height: 4rem; height: 4rem;
justify-content: center; justify-content: center;
&.pointerEventsNone{
cursor: not-allowed;
pointer-events: none;
opacity: 0.6;
}
@media (min-width: 1024px) { @media (min-width: 1024px) {
font-size: 2.4rem; font-size: 2.4rem;
} }

View File

@@ -485,11 +485,14 @@ export default defineComponent({
userId: this.userId, userId: this.userId,
organizationName: this.selectEnterprise, organizationName: this.selectEnterprise,
}; };
this.$emit('update:isMask',true)
Https.axiosPost(Https.httpUrls.accountLogin, data) Https.axiosPost(Https.httpUrls.accountLogin, data)
.then((rv: any) => { .then((rv: any) => {
this.setSuccessLogin(rv); this.setSuccessLogin(rv);
}) })
.catch((res) => {}); .catch((res) => {
this.$emit('update:isMask',false)
});
}, },
isCheckAgreement() { isCheckAgreement() {
message.info("Agree to all terms, privacy fees and policies"); message.info("Agree to all terms, privacy fees and policies");

View File

@@ -486,11 +486,14 @@ export default defineComponent({
loginType: "EMAIL", loginType: "EMAIL",
userId: this.userId, userId: this.userId,
}; };
this.$emit('update:isMask',true)
Https.axiosPost(Https.httpUrls.accountLogin, data) Https.axiosPost(Https.httpUrls.accountLogin, data)
.then((rv: any) => { .then((rv: any) => {
this.setSuccessLogin(rv); this.setSuccessLogin(rv);
}) })
.catch((res) => {}); .catch((res) => {
this.$emit('update:isMask',false)
});
}, },
isCheckAgreement() { isCheckAgreement() {
message.info("Agree to all terms, privacy fees and policies"); message.info("Agree to all terms, privacy fees and policies");

View File

@@ -488,11 +488,14 @@ export default defineComponent({
userId: this.userId, userId: this.userId,
organizationName: this.selectSchool, organizationName: this.selectSchool,
}; };
this.$emit('update:isMask',true)
Https.axiosPost(Https.httpUrls.accountLogin, data) Https.axiosPost(Https.httpUrls.accountLogin, data)
.then((rv: any) => { .then((rv: any) => {
this.setSuccessLogin(rv); this.setSuccessLogin(rv);
}) })
.catch((res) => {}); .catch((res) => {
this.$emit('update:isMask',false)
});
}, },
isCheckAgreement() { isCheckAgreement() {
message.info("Agree to all terms, privacy fees and policies"); message.info("Agree to all terms, privacy fees and policies");

View File

@@ -499,7 +499,7 @@ router.beforeEach((to: any, from, next) => {
if (to.meta.enter == "all") { if (to.meta.enter == "all") {
next(); next();
} else if ( } else if (
(state.UserHabit.userDetail.systemList.indexOf(to.meta.enter) > -1) || (vuex_systemList.indexOf(to.meta.enter)) (state.UserHabit?.userDetail?.systemList?.indexOf(to.meta.enter) > -1) || (vuex_systemList?.indexOf(to.meta.enter))
) { ) {
next(); next();
} else { } else {

View File

@@ -265,7 +265,7 @@ const userHabit : Module<UserHabit,RootState> = {
*/ */
state.userDetail.affiliate = data.affiliate state.userDetail.affiliate = data.affiliate
state.userDetail.systemUser = data.systemUser state.userDetail.systemUser = data.systemUser
// state.userDetail.systemUser = 7 // state.userDetail.systemUser = 3
// 身份列表1可以使用aida系统2:可以使用affiliate页面3系统管理员用户 // 身份列表1可以使用aida系统2:可以使用affiliate页面3系统管理员用户
state.userDetail.systemList = [] state.userDetail.systemList = []
if(data.systemUser != 0)state.userDetail.systemList.push(1) if(data.systemUser != 0)state.userDetail.systemList.push(1)

View File

@@ -266,7 +266,7 @@
</div> </div>
</template> </template>
<script > <script >
import { defineComponent, createVNode, ref,toRefs, reactive, computed, onMounted, nextTick, watch, provide } from "vue"; import { defineComponent, createVNode, ref,toRefs, reactive, computed, onMounted, nextTick, watch, provide, defineAsyncComponent } from "vue";
import { isEmail } from "@/tool/util"; import { isEmail } from "@/tool/util";
import { setCookie, getCookie, WriteCookie,clonAllCookie } from "@/tool/cookie"; import { setCookie, getCookie, WriteCookie,clonAllCookie } from "@/tool/cookie";
import payOrder from "@/component/Pay/payOrder.vue"; import payOrder from "@/component/Pay/payOrder.vue";
@@ -290,10 +290,12 @@ import MyWs from "@/tool/webSocket";
import MyEvent from "@/tool/myEvents"; import MyEvent from "@/tool/myEvents";
import { useRouter,useRoute } from 'vue-router' import { useRouter,useRoute } from 'vue-router'
import {openTypeList} from "@/tool/listData.js"; import {openTypeList} from "@/tool/listData.js";
import home from "@/component/home/index.vue"; // import home from "@/component/home/index.vue";
import projectSetting from '@/component/home/newProject/setting.vue' import projectSetting from '@/component/home/newProject/setting.vue'
import bindEmail from "@/component/HomePage/bindEmail.vue"; import bindEmail from "@/component/HomePage/bindEmail.vue";
const home = defineAsyncComponent(() =>
import('@/component/home/index.vue')
)
export default defineComponent({ export default defineComponent({
components: { components: {
renew, renew,

View File

@@ -43,12 +43,15 @@
<span>Log on to AiDA</span> <span>Log on to AiDA</span>
</div> </div>
<div class="info" v-show="!loginType">Please fill your information below</div> <div class="info" v-show="!loginType">Please fill your information below</div>
<personal ref="personal" v-if="loginType == 'personal'"></personal> <personal ref="personal" v-if="loginType == 'personal'" v-model:isMask="isMask"></personal>
<school ref="school" v-if="loginType == 'school'"></school> <school ref="school" v-if="loginType == 'school'"></school>
<enterprise ref="enterprise" v-if="loginType == 'enterprise'"></enterprise> <enterprise ref="enterprise" v-if="loginType == 'enterprise'"></enterprise>
</div> </div>
</div> </div>
<div class="mark_loading" v-show="isMask">
<a-spin size="large" />
</div>
</div> </div>
</div> </div>
</template> </template>
@@ -92,7 +95,7 @@ export default defineComponent({
const route = useRoute() const route = useRoute()
const loginData = reactive({ const loginData = reactive({
loginType: "", loginType: "",
isMask: true, isMask: false,
}); });
const dataDom = reactive({ const dataDom = reactive({
personal: null as any, personal: null as any,