Merge remote-tracking branch 'origin/StableVersion' into dev_vite
This commit is contained in:
@@ -16,29 +16,6 @@
|
|||||||
</template>
|
</template>
|
||||||
</a-range-picker>
|
</a-range-picker>
|
||||||
</div>
|
</div>
|
||||||
<!-- <div class="admin_state_item">
|
|
||||||
<span>Country or Region:</span>
|
|
||||||
<a-select
|
|
||||||
v-model:value="country"
|
|
||||||
:allowClear="true"
|
|
||||||
show-search
|
|
||||||
style="width: 230px"
|
|
||||||
:filter-option="filterOption"
|
|
||||||
placeholder="Select Item..."
|
|
||||||
max-tag-count="responsive"
|
|
||||||
:options="allCountry"
|
|
||||||
></a-select>
|
|
||||||
</div> -->
|
|
||||||
<!-- <div class="admin_state_item">
|
|
||||||
<span>Email:</span>
|
|
||||||
<input
|
|
||||||
v-model="email"
|
|
||||||
placeholder="Please enter email"
|
|
||||||
@keydown.enter="gettrialList"
|
|
||||||
type="text"
|
|
||||||
style="width: 230px"
|
|
||||||
/>
|
|
||||||
</div> -->
|
|
||||||
<div class="admin_state_item">
|
<div class="admin_state_item">
|
||||||
<span>{{ $t('admin.UserName') }}:</span>
|
<span>{{ $t('admin.UserName') }}:</span>
|
||||||
<a-select
|
<a-select
|
||||||
@@ -53,19 +30,6 @@
|
|||||||
@keydown.enter="gettrialList"
|
@keydown.enter="gettrialList"
|
||||||
></a-select>
|
></a-select>
|
||||||
</div>
|
</div>
|
||||||
<!-- <div class="admin_state_item">
|
|
||||||
<span>User Type:</span>
|
|
||||||
<a-select
|
|
||||||
v-model:value="systemUser"
|
|
||||||
size="large"
|
|
||||||
style="width: 230px"
|
|
||||||
optionFilterProp="label"
|
|
||||||
:options="state"
|
|
||||||
placeholder="Please select"
|
|
||||||
allowClear
|
|
||||||
show-search
|
|
||||||
></a-select>
|
|
||||||
</div> -->
|
|
||||||
</div>
|
</div>
|
||||||
<div class="admin_search">
|
<div class="admin_search">
|
||||||
<div class="admin_search_item" @click="searchHistoryList">
|
<div class="admin_search_item" @click="searchHistoryList">
|
||||||
@@ -116,6 +80,24 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="admin_table_content" ref="historyTable">
|
<div class="admin_table_content" ref="historyTable">
|
||||||
|
<div class="admin_state_list plan_list">
|
||||||
|
<div
|
||||||
|
v-for="plan in planFilterOptions"
|
||||||
|
:key="plan.id"
|
||||||
|
class="plan_item"
|
||||||
|
:class="{
|
||||||
|
active: subscriptionPlanId === plan.id,
|
||||||
|
disabled: plan.status === 'PENDING'
|
||||||
|
}"
|
||||||
|
@click="plan.status !== 'PENDING' && selectPlanFilter(plan.id)"
|
||||||
|
>
|
||||||
|
<span class="plan_name">{{ plan.name }}</span>
|
||||||
|
<MoreOutlined
|
||||||
|
class="plan_more_icon"
|
||||||
|
@click.stop="plan.status !== 'PENDING' && openPlanRenameModal(plan)"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<a-table
|
<a-table
|
||||||
@resizeColumn="handleResizeColumn"
|
@resizeColumn="handleResizeColumn"
|
||||||
:loading="tableLoading"
|
:loading="tableLoading"
|
||||||
@@ -147,12 +129,6 @@
|
|||||||
<div class="operate_item" @click="deleteAagree(record)">
|
<div class="operate_item" @click="deleteAagree(record)">
|
||||||
{{ $t('admin.Delete') }}
|
{{ $t('admin.Delete') }}
|
||||||
</div>
|
</div>
|
||||||
<!-- <div
|
|
||||||
class="operate_item"
|
|
||||||
@click="deleteGroup(record, index)"
|
|
||||||
>
|
|
||||||
Delete
|
|
||||||
</div> -->
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</a-table>
|
</a-table>
|
||||||
@@ -160,31 +136,58 @@
|
|||||||
<allUserPoerationsVue
|
<allUserPoerationsVue
|
||||||
ref="allUserPoerationsVue"
|
ref="allUserPoerationsVue"
|
||||||
@searchHistoryList="searchHistoryList"
|
@searchHistoryList="searchHistoryList"
|
||||||
|
:plan-options="planFilterOptions"
|
||||||
></allUserPoerationsVue>
|
></allUserPoerationsVue>
|
||||||
|
<div class="renamePlanModal" ref="renamePlanModal"></div>
|
||||||
|
<!-- 重命名订阅计划弹窗 -->
|
||||||
|
<a-modal
|
||||||
|
v-model:visible="renamePlanModalVisible"
|
||||||
|
:title="$t('admin.RenamePlan')"
|
||||||
|
@ok="confirmRenamePlan"
|
||||||
|
@cancel="cancelRenamePlan"
|
||||||
|
:ok-text="$t('admin.OK')"
|
||||||
|
:cancel-text="$t('admin.Cancel')"
|
||||||
|
:get-container="() => $refs.renamePlanModal"
|
||||||
|
>
|
||||||
|
<div class="rename-plan-form">
|
||||||
|
<div class="admin_state_item">
|
||||||
|
<span>{{ $t('admin.PlanName') }}:</span>
|
||||||
|
<a-input
|
||||||
|
v-model:value="renamePlanForm.planName"
|
||||||
|
:placeholder="$t('admin.InputPlanName')"
|
||||||
|
style="width: 250px"
|
||||||
|
@pressEnter="confirmRenamePlan"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</div>
|
||||||
<script lang="ts">
|
</a-modal>
|
||||||
import {
|
</div>
|
||||||
|
</template>
|
||||||
|
<script lang="ts">
|
||||||
|
import {
|
||||||
defineComponent,
|
defineComponent,
|
||||||
ref,
|
ref,
|
||||||
createVNode,
|
createVNode,
|
||||||
computed,
|
computed,
|
||||||
reactive,
|
reactive,
|
||||||
toRefs,
|
toRefs,
|
||||||
onMounted
|
unref,
|
||||||
} from 'vue'
|
watch
|
||||||
import { formatTime } from '@/tool/util'
|
} from 'vue'
|
||||||
import { useStore } from 'vuex'
|
import { formatTime } from '@/tool/util'
|
||||||
import { Https } from '@/tool/https'
|
import { useStore } from 'vuex'
|
||||||
import { Modal, message } from 'ant-design-vue'
|
import { Https } from '@/tool/https'
|
||||||
import { ExclamationCircleOutlined } from '@ant-design/icons-vue'
|
import { Modal, message, Input } from 'ant-design-vue'
|
||||||
import allUserPoerationsVue from './addAllUser.vue'
|
import { ExclamationCircleOutlined, MoreOutlined } from '@ant-design/icons-vue'
|
||||||
import { useI18n } from 'vue-i18n'
|
import allUserPoerationsVue from './addAllUser.vue'
|
||||||
import SelectUser from '@/component/common/SelectUser.vue'
|
import { useI18n } from 'vue-i18n'
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: { allUserPoerationsVue },
|
components: { allUserPoerationsVue, MoreOutlined },
|
||||||
setup() {
|
setup() {
|
||||||
const store: any = useStore()
|
const store: any = useStore()
|
||||||
|
const currentOrganizationId = computed(
|
||||||
|
() => store.state.UserHabit.userDetail.organizationId
|
||||||
|
)
|
||||||
const selectedRowKeys = ref([]) as any
|
const selectedRowKeys = ref([]) as any
|
||||||
const onSelectChange = (changableRowKeys: string[]) => {
|
const onSelectChange = (changableRowKeys: string[]) => {
|
||||||
selectedRowKeys.value = changableRowKeys
|
selectedRowKeys.value = changableRowKeys
|
||||||
@@ -203,6 +206,7 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
const { t } = useI18n()
|
const { t } = useI18n()
|
||||||
|
|
||||||
let filterData: any = reactive({
|
let filterData: any = reactive({
|
||||||
@@ -218,10 +222,16 @@ export default defineComponent({
|
|||||||
systemUser: '',
|
systemUser: '',
|
||||||
order: '', //'Ascending 升序 Descending 降序'
|
order: '', //'Ascending 升序 Descending 降序'
|
||||||
orderBy: '',
|
orderBy: '',
|
||||||
userName: ''
|
userName: '',
|
||||||
|
subscriptionPlanId: ''
|
||||||
})
|
})
|
||||||
|
|
||||||
let renameData: any = ref({}) //修改名字选中的数据
|
let renameData: any = ref({}) //修改名字选中的数据
|
||||||
|
const renamePlanModalVisible = ref(false)
|
||||||
|
const renamePlanForm = reactive({
|
||||||
|
planId: null as number | null,
|
||||||
|
planName: ''
|
||||||
|
})
|
||||||
const columns: any = computed(() => {
|
const columns: any = computed(() => {
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
@@ -248,13 +258,6 @@ export default defineComponent({
|
|||||||
key: 'userName',
|
key: 'userName',
|
||||||
width: 150,
|
width: 150,
|
||||||
ellipsis: true
|
ellipsis: true
|
||||||
// customRender: (record: any) => {
|
|
||||||
// let time = formatTime(
|
|
||||||
// record.text / 1000,
|
|
||||||
// "YYYY-MM-DD hh:mm:ss"
|
|
||||||
// );
|
|
||||||
// return time;
|
|
||||||
// },
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: t('admin.language'),
|
title: t('admin.language'),
|
||||||
@@ -278,10 +281,6 @@ export default defineComponent({
|
|||||||
{
|
{
|
||||||
title: t('admin.Credits'),
|
title: t('admin.Credits'),
|
||||||
align: 'center',
|
align: 'center',
|
||||||
// width: 150,
|
|
||||||
// minWidth: 100,
|
|
||||||
// maxWidth: 200,
|
|
||||||
// resizable: true,
|
|
||||||
dataIndex: 'credits',
|
dataIndex: 'credits',
|
||||||
key: 'credits',
|
key: 'credits',
|
||||||
width: 100,
|
width: 100,
|
||||||
@@ -309,7 +308,6 @@ export default defineComponent({
|
|||||||
width: 120,
|
width: 120,
|
||||||
align: 'center',
|
align: 'center',
|
||||||
fixed: 'right',
|
fixed: 'right',
|
||||||
// slots:{customRender:'action'}
|
|
||||||
Operations: true
|
Operations: true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -354,7 +352,8 @@ export default defineComponent({
|
|||||||
(filterData.order = ''), //'Ascending 升序 Descending 降序'
|
(filterData.order = ''), //'Ascending 升序 Descending 降序'
|
||||||
(filterData.orderBy = ''), //'Ascending 升序 Descending 降序'
|
(filterData.orderBy = ''), //'Ascending 升序 Descending 降序'
|
||||||
(filterData.systemUser = ''),
|
(filterData.systemUser = ''),
|
||||||
(filterData.userName = '')
|
(filterData.userName = ''),
|
||||||
|
(filterData.subscriptionPlanId = '')
|
||||||
}
|
}
|
||||||
let setHistoryListData = () => {
|
let setHistoryListData = () => {
|
||||||
let startDate: any = filterData.rangePickerValue?.[0]
|
let startDate: any = filterData.rangePickerValue?.[0]
|
||||||
@@ -377,18 +376,17 @@ export default defineComponent({
|
|||||||
order: filterData.order,
|
order: filterData.order,
|
||||||
orderBy: filterData.orderBy,
|
orderBy: filterData.orderBy,
|
||||||
// userName: filterData.userName,
|
// userName: filterData.userName,
|
||||||
userName: filterData.ids
|
userName: filterData.ids,
|
||||||
|
subscriptionPlanId: filterData.subscriptionPlanId
|
||||||
}
|
}
|
||||||
return data
|
return data
|
||||||
}
|
}
|
||||||
//获取列表
|
//获取列表
|
||||||
let gettrialList = () => {
|
const gettrialList = () => {
|
||||||
filter.tableLoading = true
|
filter.tableLoading = true
|
||||||
let data = setHistoryListData()
|
let data = setHistoryListData()
|
||||||
Https.axiosPost(Https.httpUrls.subAccountList, data).then((rv: any) => {
|
Https.axiosPost(Https.httpUrls.subAccountList, data).then((rv: any) => {
|
||||||
if (rv) {
|
if (rv) {
|
||||||
console.log(rv)
|
|
||||||
// this.dataList = rv
|
|
||||||
filter.dataList = rv.content
|
filter.dataList = rv.content
|
||||||
filterData.total = rv.total
|
filterData.total = rv.total
|
||||||
filter.tableLoading = false
|
filter.tableLoading = false
|
||||||
@@ -417,6 +415,66 @@ export default defineComponent({
|
|||||||
// 使用 option.label 进行搜索
|
// 使用 option.label 进行搜索
|
||||||
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
|
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
|
||||||
}
|
}
|
||||||
|
// 订阅计划筛选(按钮点击)
|
||||||
|
const selectPlanFilter = async (planId: string) => {
|
||||||
|
filterData.subscriptionPlanId = planId
|
||||||
|
// 切换管理员订阅计划
|
||||||
|
Https.axiosGet(Https.httpUrls.switchSubscribePlan, {
|
||||||
|
params: {
|
||||||
|
targetSubscriptionPlanId: planId,
|
||||||
|
adminAccId: store.state.UserHabit.userDetail.id
|
||||||
|
}
|
||||||
|
}).then((res: any) => {
|
||||||
|
console.log(res)
|
||||||
|
})
|
||||||
|
searchHistoryList()
|
||||||
|
}
|
||||||
|
const planFilterOptions = ref([])
|
||||||
|
const fetchSubscribePlanList = () => {
|
||||||
|
const orgId = currentOrganizationId.value
|
||||||
|
if (!orgId) return
|
||||||
|
Https.axiosPost(Https.httpUrls.searchSubscribeByOrg, {
|
||||||
|
organizationId: orgId,
|
||||||
|
status: ['ACTIVE', 'PENDING']
|
||||||
|
}).then(res => {
|
||||||
|
// 将与当前用户 subscriptionPlanId 相同的订阅计划放到第一个
|
||||||
|
const userSubscriptionPlanId = store.state.UserHabit.userDetail.subscriptionPlanId
|
||||||
|
if (userSubscriptionPlanId && Array.isArray(res)) {
|
||||||
|
const sortedList = [...res].sort((a: any, b: any) => {
|
||||||
|
const isAUserPlan = a.id == userSubscriptionPlanId
|
||||||
|
const isBUserPlan = b.id == userSubscriptionPlanId
|
||||||
|
if (isAUserPlan && !isBUserPlan) return -1
|
||||||
|
if (!isAUserPlan && isBUserPlan) return 1
|
||||||
|
return 0
|
||||||
|
})
|
||||||
|
planFilterOptions.value = sortedList
|
||||||
|
} else {
|
||||||
|
planFilterOptions.value = res
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// 监听组织ID,获取到值后再拉取订阅计划
|
||||||
|
watch(
|
||||||
|
() => currentOrganizationId.value,
|
||||||
|
orgId => {
|
||||||
|
if (orgId) {
|
||||||
|
fetchSubscribePlanList()
|
||||||
|
const userSubscriptionPlanId =
|
||||||
|
store.state.UserHabit.userDetail.subscriptionPlanId
|
||||||
|
if (userSubscriptionPlanId) {
|
||||||
|
selectPlanFilter(userSubscriptionPlanId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ immediate: true }
|
||||||
|
)
|
||||||
|
// 打开重命名弹窗(基于当前点击的计划)
|
||||||
|
const openPlanRenameModal = plan => {
|
||||||
|
renamePlanForm.planId = plan.id
|
||||||
|
renamePlanForm.planName = plan?.name || ''
|
||||||
|
renamePlanModalVisible.value = true
|
||||||
|
console.log(renamePlanForm)
|
||||||
|
}
|
||||||
let addhHistoryList = () => {
|
let addhHistoryList = () => {
|
||||||
allUserPoerationsVue.value.init({ value: 'Add', label: t('admin.add') }, '')
|
allUserPoerationsVue.value.init({ value: 'Add', label: t('admin.add') }, '')
|
||||||
}
|
}
|
||||||
@@ -521,6 +579,33 @@ export default defineComponent({
|
|||||||
gettrialList()
|
gettrialList()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 确认重命名
|
||||||
|
const confirmRenamePlan = () => {
|
||||||
|
if (!renamePlanForm.planName || !renamePlanForm.planName.trim()) {
|
||||||
|
message.warning(t('admin.PlanNameRequired'))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
Https.axiosPost(Https.httpUrls.updateSubscribePlan, {
|
||||||
|
id: renamePlanForm.planId,
|
||||||
|
name: renamePlanForm.planName.trim()
|
||||||
|
})
|
||||||
|
.then((rv: any) => {
|
||||||
|
message.success(t('admin.RenamePlanSuccess'))
|
||||||
|
renamePlanModalVisible.value = false
|
||||||
|
fetchSubscribePlanList()
|
||||||
|
})
|
||||||
|
.catch((error: any) => {
|
||||||
|
message.error(error.message || t('admin.RenamePlanFailed'))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// 取消重命名
|
||||||
|
const cancelRenamePlan = () => {
|
||||||
|
renamePlanModalVisible.value = false
|
||||||
|
renamePlanForm.planId = null
|
||||||
|
renamePlanForm.planName = ''
|
||||||
|
}
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
let allCountry: any = sessionStorage.getItem('allCountry')
|
let allCountry: any = sessionStorage.getItem('allCountry')
|
||||||
if (allCountry) {
|
if (allCountry) {
|
||||||
@@ -545,7 +630,15 @@ export default defineComponent({
|
|||||||
ExportAccountData,
|
ExportAccountData,
|
||||||
uploadTemplate,
|
uploadTemplate,
|
||||||
deleteList,
|
deleteList,
|
||||||
deleteAagree
|
deleteAagree,
|
||||||
|
planFilterOptions,
|
||||||
|
selectPlanFilter,
|
||||||
|
openPlanRenameModal,
|
||||||
|
renamePlanModalVisible,
|
||||||
|
renamePlanForm,
|
||||||
|
confirmRenamePlan,
|
||||||
|
cancelRenamePlan,
|
||||||
|
fetchSubscribePlanList
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
@@ -557,31 +650,42 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
let historyTable: any = this.$refs.historyTable
|
this.updateTableHeight()
|
||||||
this.historyTableHeight = historyTable.clientHeight - 200
|
window.addEventListener('resize', this.updateTableHeight)
|
||||||
},
|
},
|
||||||
methods: {}
|
beforeUnmount() {
|
||||||
})
|
window.removeEventListener('resize', this.updateTableHeight)
|
||||||
</script>
|
},
|
||||||
<style lang="less" scoped>
|
methods: {
|
||||||
.admin_page {
|
updateTableHeight() {
|
||||||
|
const historyTable: any = this.$refs.historyTable
|
||||||
|
if (historyTable) {
|
||||||
|
// 为底部分页器预留固定空间,使表格部分高度固定且分页器始终可见
|
||||||
|
this.historyTableHeight = historyTable.clientHeight - 200
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.admin_page {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
.admin_table_content {
|
.admin_table_content {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
.admin_page .admin_table_search .admin_state {
|
.admin_page .admin_table_search .admin_state {
|
||||||
display: flex;
|
display: flex;
|
||||||
width: 70%;
|
width: 70%;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
align-content: flex-start;
|
align-content: flex-start;
|
||||||
}
|
}
|
||||||
.admin_page .admin_table_search .admin_search {
|
.admin_page .admin_table_search .admin_search {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
width: 30%;
|
width: 30%;
|
||||||
@@ -589,12 +693,86 @@ export default defineComponent({
|
|||||||
height: 4rem;
|
height: 4rem;
|
||||||
font-size: 1.6rem;
|
font-size: 1.6rem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.all-user {
|
.plan_list {
|
||||||
|
margin-top: 1rem;
|
||||||
|
display: flex;
|
||||||
|
// flex-wrap: wrap;
|
||||||
|
padding-left: 2.8rem;
|
||||||
|
column-gap: 0.6rem;
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
.plan_item {
|
||||||
|
height: 4rem;
|
||||||
|
width: auto;
|
||||||
|
min-width: 10rem;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
// font-size: 1.8rem;
|
||||||
|
|
||||||
|
font-weight: 600;
|
||||||
|
border-radius: 1.3rem;
|
||||||
|
color: #fff;
|
||||||
|
cursor: pointer;
|
||||||
|
border: 1.8px solid #000;
|
||||||
|
background-color: #000;
|
||||||
|
padding: 0 1rem 0 2rem;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: #000;
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.active {
|
||||||
|
background: #ffffff;
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.disabled {
|
||||||
|
opacity: 0.5;
|
||||||
|
cursor: not-allowed;
|
||||||
|
background-color: #d9d9d9;
|
||||||
|
border-color: #d9d9d9;
|
||||||
|
color: #999;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: #d9d9d9;
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.plan_item {
|
||||||
|
column-gap: 0.6rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.plan_more_icon {
|
||||||
|
font-size: 1.6rem;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.subscription-plan-cell {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
.rename-plan-form {
|
||||||
|
padding: 2rem 0;
|
||||||
|
.admin_state_item {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
> span {
|
||||||
|
width: 10rem;
|
||||||
|
margin-right: 1rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.all-user {
|
||||||
.admin_table_content {
|
.admin_table_content {
|
||||||
:deep(.ant-table-wrapper) {
|
:deep(.ant-table-wrapper) {
|
||||||
overflow: hidden ;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -71,17 +71,17 @@ export class LayerSort {
|
|||||||
// if (!layer.visible) {
|
// if (!layer.visible) {
|
||||||
// continue;
|
// continue;
|
||||||
// }
|
// }
|
||||||
|
let id = layer.fabricObject?.id || layer.fabricObjects?.[0]?.id || null;
|
||||||
// 处理不同类型的图层
|
// 处理不同类型的图层
|
||||||
if (layer.isBackground && layer.fabricObject) {
|
if (layer.isBackground && id) {
|
||||||
// 背景图层对象放在最底层
|
// 背景图层对象放在最底层
|
||||||
zIndexMap.set(layer.fabricObject.id, currentZIndex++);
|
zIndexMap.set(id, currentZIndex++);
|
||||||
} else if (layer.isFixed && layer.fabricObject) {
|
} else if (layer.isFixed && id) {
|
||||||
// 固定图层对象
|
// 固定图层对象
|
||||||
zIndexMap.set(layer.fabricObject.id, currentZIndex++);
|
zIndexMap.set(id, currentZIndex++);
|
||||||
} else if (layer.isFixedOther && layer.fabricObject) {
|
} else if (layer.isFixedOther && id) {
|
||||||
// 其他固定图层对象
|
// 其他固定图层对象
|
||||||
zIndexMap.set(layer.fabricObject.id, currentZIndex++);
|
zIndexMap.set(id, currentZIndex++);
|
||||||
} else if (!layer.isBackground && !layer.isFixed) {
|
} else if (!layer.isBackground && !layer.isFixed) {
|
||||||
// 普通图层
|
// 普通图层
|
||||||
currentZIndex = this.processLayerObjects(
|
currentZIndex = this.processLayerObjects(
|
||||||
|
|||||||
@@ -287,12 +287,27 @@ export default defineComponent({
|
|||||||
const saveCanvas = async (canvasData:any)=>{
|
const saveCanvas = async (canvasData:any)=>{
|
||||||
const index = detailData.designDetail.clothes.findIndex(item => item.id === canvasData.id);
|
const index = detailData.designDetail.clothes.findIndex(item => item.id === canvasData.id);
|
||||||
await new Promise<void>((resolve, reject) => {
|
await new Promise<void>((resolve, reject) => {
|
||||||
let canvasJSON = JSON.parse(canvasData.canvasJSON)
|
if(!detailDom?.editCanvas)return resolve()
|
||||||
if(!canvasJSON)return resolve()
|
let canvasJSON = detailDom?.editCanvas?.getJSON()
|
||||||
// canvasData.canvas.objects.forEach((objectsItem:any) => {
|
let canvasData = JSON.parse(canvasJSON)
|
||||||
// if(objectsItem.type == 'image')objectsItem.minioUrl = getMinioUrl(objectsItem.src)
|
if(!canvasData)return resolve()
|
||||||
// });
|
function deepProcessObjects(data:any, callback:any) {
|
||||||
let blob = new Blob([JSON.stringify(canvasJSON)], { type: "application/json" });
|
if (!Array.isArray(data)) return data;
|
||||||
|
return data.map(item => {
|
||||||
|
callback(item)
|
||||||
|
const processedItem = {...item};
|
||||||
|
if (processedItem.objects &&
|
||||||
|
Array.isArray(processedItem.objects) &&
|
||||||
|
processedItem.objects.length > 0) {
|
||||||
|
processedItem.objects = deepProcessObjects(processedItem.objects, callback);
|
||||||
|
}
|
||||||
|
return processedItem;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
canvasData.canvas.objects = deepProcessObjects(canvasData.canvas.objects,(item:any)=>{
|
||||||
|
if(item.type == 'image')item.minioUrl = getMinioUrl(item.src)
|
||||||
|
})
|
||||||
|
let blob = new Blob([JSON.stringify(canvasData)], { type: "application/json" });
|
||||||
let formData = new FormData();
|
let formData = new FormData();
|
||||||
formData.append("file", blob, "data.json");
|
formData.append("file", blob, "data.json");
|
||||||
formData.append("designItemDetailId", detailData.selectDetail.id);
|
formData.append("designItemDetailId", detailData.selectDetail.id);
|
||||||
|
|||||||
@@ -925,6 +925,8 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
onCancel() {}
|
onCancel() {}
|
||||||
})
|
})
|
||||||
|
}else{
|
||||||
|
this.fileList = this.fileList.filter((item: any) => item.imgUrl)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -854,6 +854,10 @@ export default defineComponent({
|
|||||||
font-size: 2.2rem;
|
font-size: 2.2rem;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: #030303;
|
color: #030303;
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
font-size: 1.2rem;
|
||||||
|
margin-left: .5rem;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.email_last_step_block_icon {
|
.email_last_step_block_icon {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
|||||||
@@ -161,6 +161,13 @@
|
|||||||
font-size: 2.4rem;
|
font-size: 2.4rem;
|
||||||
line-height: 8.7rem;
|
line-height: 8.7rem;
|
||||||
outline: none;
|
outline: none;
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
border-radius: .7rem;
|
||||||
|
width: 3.5rem;
|
||||||
|
height: 3.5rem;
|
||||||
|
font-size: 1.8rem;
|
||||||
|
line-height: 3.5rem;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
input:last-of-type {
|
input:last-of-type {
|
||||||
margin-right: 0;
|
margin-right: 0;
|
||||||
|
|||||||
@@ -335,9 +335,22 @@ export default defineComponent({
|
|||||||
let canvasData = JSON.parse(canvasJSON)
|
let canvasData = JSON.parse(canvasJSON)
|
||||||
|
|
||||||
if(!canvasData)return
|
if(!canvasData)return
|
||||||
canvasData.canvas.objects.forEach((objectsItem:any) => {
|
function deepProcessObjects(data:any, callback:any) {
|
||||||
if(objectsItem.type == 'image')objectsItem.minioUrl = getMinioUrl(objectsItem.src)
|
if (!Array.isArray(data)) return data;
|
||||||
|
return data.map(item => {
|
||||||
|
callback(item)
|
||||||
|
const processedItem = {...item};
|
||||||
|
if (processedItem.objects &&
|
||||||
|
Array.isArray(processedItem.objects) &&
|
||||||
|
processedItem.objects.length > 0) {
|
||||||
|
processedItem.objects = deepProcessObjects(processedItem.objects, callback);
|
||||||
|
}
|
||||||
|
return processedItem;
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
canvasData.canvas.objects = deepProcessObjects(canvasData.canvas.objects,(item:any)=>{
|
||||||
|
if(item.type == 'image')item.minioUrl = getMinioUrl(item.src)
|
||||||
|
})
|
||||||
let blob = new Blob([JSON.stringify(canvasData)], { type: "application/json" });
|
let blob = new Blob([JSON.stringify(canvasData)], { type: "application/json" });
|
||||||
let formData = new FormData();
|
let formData = new FormData();
|
||||||
formData.append("file", blob, "data.json");
|
formData.append("file", blob, "data.json");
|
||||||
|
|||||||
@@ -206,11 +206,22 @@ export default defineComponent({
|
|||||||
if(!canvasJSON)return
|
if(!canvasJSON)return
|
||||||
if(!store.state.Workspace.probjects?.id)return
|
if(!store.state.Workspace.probjects?.id)return
|
||||||
let canvasData = JSON.parse(canvasJSON)
|
let canvasData = JSON.parse(canvasJSON)
|
||||||
console.log(canvasData)
|
function deepProcessObjects(data:any, callback:any) {
|
||||||
canvasData.canvas.objects.forEach((objectsItem:any) => {
|
if (!Array.isArray(data)) return data;
|
||||||
if(objectsItem.type == 'image')objectsItem.minioUrl = getMinioUrl(objectsItem.src)
|
return data.map(item => {
|
||||||
|
callback(item)
|
||||||
|
const processedItem = {...item};
|
||||||
|
if (processedItem.objects &&
|
||||||
|
Array.isArray(processedItem.objects) &&
|
||||||
|
processedItem.objects.length > 0) {
|
||||||
|
processedItem.objects = deepProcessObjects(processedItem.objects, callback);
|
||||||
|
}
|
||||||
|
return processedItem;
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
canvasData.canvas.objects = deepProcessObjects(canvasData.canvas.objects,(item:any)=>{
|
||||||
|
if(item.type == 'image')item.minioUrl = getMinioUrl(item.src)
|
||||||
|
})
|
||||||
let blob = new Blob([JSON.stringify(canvasData)], { type: "application/json" });
|
let blob = new Blob([JSON.stringify(canvasData)], { type: "application/json" });
|
||||||
let formData = new FormData();
|
let formData = new FormData();
|
||||||
formData.append("file", blob, "data.json");
|
formData.append("file", blob, "data.json");
|
||||||
|
|||||||
@@ -79,7 +79,7 @@
|
|||||||
Forgot password?
|
Forgot password?
|
||||||
</div> -->
|
</div> -->
|
||||||
</div>
|
</div>
|
||||||
<div class="password_input_block">
|
<div class="password_input_block" v-show="emailStap !== 2">
|
||||||
<div v-show="passwordConditionShow" class="conditionShow">
|
<div v-show="passwordConditionShow" class="conditionShow">
|
||||||
<div class="item">
|
<div class="item">
|
||||||
<div class="icon">
|
<div class="icon">
|
||||||
@@ -144,12 +144,13 @@
|
|||||||
@click="changePasswordType()"
|
@click="changePasswordType()"
|
||||||
></div>
|
></div>
|
||||||
</div>
|
</div>
|
||||||
<span style="font-weight: 400; opacity: 0.7"
|
<span style="font-weight: 400; opacity: 0.7" v-show="emailStap !== 2"
|
||||||
>{{ userI18n[selectUserI18n].inputPasswordTip }}</span
|
>{{ userI18n[selectUserI18n].inputPasswordTip }}</span
|
||||||
>
|
>
|
||||||
<div class="login_form_title marign_top30">{{ userI18n[selectUserI18n].Email }}</div>
|
<div class="login_form_title marign_top30" v-show="emailStap !== 2">{{ userI18n[selectUserI18n].Email }}</div>
|
||||||
<input
|
<input
|
||||||
class="login_form_input"
|
class="login_form_input"
|
||||||
|
v-show="emailStap !== 2"
|
||||||
:placeholder="userI18n[selectUserI18n].inputEmail"
|
:placeholder="userI18n[selectUserI18n].inputEmail"
|
||||||
v-model="email"
|
v-model="email"
|
||||||
@keydown.enter="submitPerLogin()"
|
@keydown.enter="submitPerLogin()"
|
||||||
@@ -917,6 +918,7 @@ export default defineComponent({
|
|||||||
position: relative;
|
position: relative;
|
||||||
@media (max-width: 768px) {
|
@media (max-width: 768px) {
|
||||||
margin-top: 2.4rem;
|
margin-top: 2.4rem;
|
||||||
|
height: 20rem;
|
||||||
}
|
}
|
||||||
&[state="2"] {
|
&[state="2"] {
|
||||||
> * {
|
> * {
|
||||||
@@ -1015,6 +1017,9 @@ export default defineComponent({
|
|||||||
// margin-top: 4rem;
|
// margin-top: 4rem;
|
||||||
.email_last_step_bottom {
|
.email_last_step_bottom {
|
||||||
padding: 0 40px;
|
padding: 0 40px;
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
padding: 0 2rem;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.email_last_step_block {
|
.email_last_step_block {
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
@@ -1028,6 +1033,10 @@ export default defineComponent({
|
|||||||
font-size: 2.2rem;
|
font-size: 2.2rem;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: #030303;
|
color: #030303;
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
font-size: 1.2rem;
|
||||||
|
margin-left: .5rem;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.email_last_step_block_icon {
|
.email_last_step_block_icon {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
@@ -1229,6 +1238,9 @@ export default defineComponent({
|
|||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: #000;
|
color: #000;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
font-size: 1rem;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.email_last_step_des {
|
.email_last_step_des {
|
||||||
@@ -1237,16 +1249,25 @@ export default defineComponent({
|
|||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
margin-top: 4rem;
|
margin-top: 4rem;
|
||||||
margin-bottom: 2rem;
|
margin-bottom: 2rem;
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
margin-top: 2rem;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
.sent_email_content {
|
.sent_email_content {
|
||||||
font-size: 1.8rem;
|
font-size: 1.8rem;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: #a5b0c2;
|
color: #a5b0c2;
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
font-size: 1.2rem;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.email_tip_content {
|
.email_tip_content {
|
||||||
font-size: 1.4rem;
|
font-size: 1.4rem;
|
||||||
color: #030303;
|
color: #030303;
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
font-size: 1.2rem;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -165,9 +165,22 @@ export default defineComponent({
|
|||||||
time = setTimeout(()=>{
|
time = setTimeout(()=>{
|
||||||
let canvasData = JSON.parse(canvasJSON)
|
let canvasData = JSON.parse(canvasJSON)
|
||||||
if(!canvasData)return
|
if(!canvasData)return
|
||||||
canvasData.canvas.objects.forEach((objectsItem:any) => {
|
function deepProcessObjects(data:any, callback:any) {
|
||||||
if(objectsItem.type == 'image')objectsItem.minioUrl = getMinioUrl(objectsItem.src)
|
if (!Array.isArray(data)) return data;
|
||||||
|
return data.map(item => {
|
||||||
|
callback(item)
|
||||||
|
const processedItem = {...item};
|
||||||
|
if (processedItem.objects &&
|
||||||
|
Array.isArray(processedItem.objects) &&
|
||||||
|
processedItem.objects.length > 0) {
|
||||||
|
processedItem.objects = deepProcessObjects(processedItem.objects, callback);
|
||||||
|
}
|
||||||
|
return processedItem;
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
canvasData.canvas.objects = deepProcessObjects(canvasData.canvas.objects,(item:any)=>{
|
||||||
|
if(item.type == 'image')item.minioUrl = getMinioUrl(item.src)
|
||||||
|
})
|
||||||
let blob = new Blob([JSON.stringify(canvasData)], { type: "application/json" });
|
let blob = new Blob([JSON.stringify(canvasData)], { type: "application/json" });
|
||||||
let formData = new FormData();
|
let formData = new FormData();
|
||||||
formData.append("file", blob, "data.json");
|
formData.append("file", blob, "data.json");
|
||||||
|
|||||||
@@ -1814,6 +1814,8 @@ export default defineComponent({
|
|||||||
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
}else{
|
||||||
|
this.generateList[selectCodeStr] = this.generateList[selectCodeStr].filter((item: any) => item.imgUrl)
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@@ -2420,6 +2422,7 @@ export default defineComponent({
|
|||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
|
position: absolute;
|
||||||
}
|
}
|
||||||
&:hover .img_item_hover{
|
&:hover .img_item_hover{
|
||||||
// display: block;
|
// display: block;
|
||||||
|
|||||||
@@ -8,15 +8,15 @@
|
|||||||
<!-- <div class="upgrade-content-text">System upgrading</div> -->
|
<!-- <div class="upgrade-content-text">System upgrading</div> -->
|
||||||
<div class="upgrade-content-text">System maintenance</div>
|
<div class="upgrade-content-text">System maintenance</div>
|
||||||
<!-- 没有截至时间 -->
|
<!-- 没有截至时间 -->
|
||||||
<div class="upgrade-content-textab">The AiDA system cannot be accessed temporarily due to system server maintenance. We apologize for any inconvenience this may cause and thank you for your understanding.</div>
|
<!-- <div class="upgrade-content-textab">The AiDA system cannot be accessed temporarily due to system server maintenance. We apologize for any inconvenience this may cause and thank you for your understanding.</div> -->
|
||||||
<!-- <div class="upgrade-content-textab">Due to the system server upgrade, we will start the upgrade from 9:30 am Hong Kong time on the weekend of October 20th until October 21st. During this time,<br> the AiDA system will be temporarily inaccessible. We apologize for any inconvenience this may cause and thank you for your understanding.</div> -->
|
<!-- <div class="upgrade-content-textab">Due to the system server upgrade, we will start the upgrade from 9:30 am Hong Kong time on the weekend of October 20th until October 21st. During this time,<br> the AiDA system will be temporarily inaccessible. We apologize for any inconvenience this may cause and thank you for your understanding.</div> -->
|
||||||
<!-- 有截至时间 -->
|
<!-- 有截至时间 -->
|
||||||
<!-- <div class="upgrade-content-textab">Due to system server upgrades, we will be upgrading from Tuesday, September 2 at 00:00 (HKT) to Wednesday, September 3 at 00:00. During this period, the AiDA system will be temporarily inaccessible. <br>We sincerely apologize for the inconvenience caused and thank you for your understanding</div> -->
|
<div class="upgrade-content-textab">Due to system server upgrades, maintenance will be carried out from 21:00 to 22:00 on December 19.<br>The AiDA system will be temporarily unavailable during this period. We sincerely apologize for any inconvenience caused and thank you for your understanding.</div>
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
<div class="upgrade-content-textab">由于系统服务器维护,AiDA系统暂时无法访问。对于由此造成的任何不便,我们深表歉意,并感谢您的理解</div>
|
<!-- <div class="upgrade-content-textab">由于系统服务器维护,AiDA系统暂时无法访问。对于由此造成的任何不便,我们深表歉意,并感谢您的理解</div> -->
|
||||||
<!-- <div class="upgrade-content-textab">由于系统服务器升级,我们将于9月2日(星期二)凌晨00:00(香港时间)至9月3日(星期三)凌晨00:00进行升级。<br>在此期间,AiDA系统将暂时无法访问。给您带来的不便,我们深表歉意,并感谢您的理解</div> -->
|
<div class="upgrade-content-textab">由于系统服务器升级,我们将于12月19日21:00 至12月19日22:00进行升级。<br>在此期间,AiDA系统将暂时无法访问。给您带来的不便,我们深表歉意,并感谢您的理解</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
Reference in New Issue
Block a user