fix: 🧩 修复bug

This commit is contained in:
2025-04-01 15:15:35 +08:00
parent 716b383a87
commit af5894dd5a
25 changed files with 112 additions and 82 deletions

View File

@@ -103,51 +103,6 @@
}
</script>
<script type="module" src="/src/main.ts"></script>
<script>
// let gwUser = JSON.parse(localStorage.getItem("gw-user"));
// if (gwUser) {
// const { phpToken, refreshToken } = gwUser;
// function offline() {
// const pathurl = localStorage.getItem("baseUrl") + `uc/offline`;
// fetch(pathurl, {
// method: "POST",
// credentials: "include",
// keepalive: true,
// headers: {
// Authorization: phpToken,
// "Refresh-Authorization": refreshToken
// }
// });
// }
// window.onbeforeunload = function (e) {
// offline();
// };
// var ua = window.navigator.userAgent.toLowerCase();
// var rkn =
// /\b(opera|chrome|webkit|safari|msie|firefox|gecko|qqbrowser|edg)\b(\s*(version|rv:|\/)*(\d+(\.\d+)*))?/g;
// window.addEventListener("mouseover", function () {
// window.removeEventListener("beforeunload", offline, true);
// ua.replace(rkn, function (match, type, all, rv, version) {
// if (type == "chrome" && parseInt(version) <= 86) {
// window.removeEventListener("unload", offline, true);
// }
// });
// });
// window.addEventListener("mouseout", function () {
// window.addEventListener("beforeunload", offline, true);
// ua.replace(rkn, function (match, type, all, rv, version) {
// if (type == "qqbrowser" || type == "edg" || (type == "chrome" && parseInt(version) <= 86)) {
// window.addEventListener("unload", offline, true);
// }
// });
// });
// if (window.location.pathnam !== "/login") {
// window.removeEventListener("beforeunload", offline);
// window.removeEventListener("unload", offline);
// }
// }
</script>
<script></script>
</body>
</html>

View File

@@ -37,6 +37,6 @@ export const getBannerListExportApi = (params: any) => {
});
};
//分类
export const getBannerClassListApi = (params: any) => {
export const getBannerClassListApi = (params?: any) => {
return http.get<any>(`/banner/list`, params); //v1/banner/list
};

View File

@@ -26,6 +26,6 @@ export const getCategorySortApi = (params: any) => {
return http.post<any>(`${ATT_C}/sort/${params.id}`, { sort: params.sort });
};
//下载分类下拉列表
export const getCategorysApi = (params: any) => {
export const getCategorysApi = (params?: any) => {
return http.get<any>(`/attachment/categorys`, params);
};

View File

@@ -36,7 +36,7 @@ export const getProductListSortApi = (params: any) => {
const { id, sort } = params;
return http.post<any>(`${PRODUCT}/sort/${id}`, { sort });
};
// getProductCategoryListApi
export const getProductCategoryListApi = () => {
return http.get<any>(`/product/categorys`);
// 产品分类
export const getProductCategoryListApi = (params?: any) => {
return http.get<any>(`/product/categorys`, params);
};

View File

@@ -1,7 +1,7 @@
import http from "@/api";
const VIDEO_CATEGORY = `video/category`;
// 视频分类分页列表
export const getVideoClassListApi = (params: any) => {
export const getVideoClassListApi = (params?: any) => {
return http.get<any>(`${VIDEO_CATEGORY}/index`, params);
};
//视频分类详情

View File

@@ -27,6 +27,6 @@ export const getVideoListExportApi = (params: any) => {
});
};
//视频分类
export const getVideoClassListApi = (params: any) => {
export const getVideoClassListApi = (params?: any) => {
return http.get<any>(`/video/categorys`, params);
};

View File

@@ -124,7 +124,13 @@
<UploadVideo width="440px" v-model:video-url="_ruleForm[`${item.prop}`]"> </UploadVideo>
</template>
<template v-if="item.type === 'select'">
<el-select style="width: 240px" v-model="_ruleForm[`${item.prop}`]" :placeholder="item.placeholder" clearable>
<el-select
style="width: 240px"
v-model="_ruleForm[`${item.prop}`]"
:placeholder="item.placeholder"
clearable
@change="handleSelectChange(_ruleForm[`${item.prop}`])"
>
<el-option
:label="option.label"
:value="option.value"

View File

@@ -27,7 +27,7 @@ export const EDIT_FORM_DATA: FormItem[] = [
},
{
prop: "category_id",
prop: "category_id1",
placeholder: "请选择",
type: "select",
label: "文章分类: ",
@@ -59,7 +59,7 @@ export const EDIT_FORM_DATA: FormItem[] = [
// prop: "is_show1",
// placeholder: "",
// type: "radio",
// label: "是否启: ",
// label: "是否启: ",
// options: [
// {
// label: "是",

View File

@@ -1,5 +1,5 @@
export const RULES = {
title: [{ required: true, message: "文章名称不能为空 ! ", trigger: "blur" }],
category_id: [{ required: true, message: "文章分类不能为空 ! ", trigger: "change" }],
category_id1: [{ required: true, message: "文章分类不能为空 ! ", trigger: "change" }],
sort: [{ required: true, message: "文章排序不能为空 ! ", trigger: "blur" }]
};

View File

@@ -14,6 +14,7 @@
:formData="dataStore.editFormData"
:rules="dataStore.rules"
ref="formRef"
@handleSelectChangeEmits="handleSelectChangeEmits"
/>
</el-tab-pane>
@@ -80,9 +81,19 @@ const getArticleListDetails = async () => {
const { data } = result;
dataStore.editRuleForm = data;
console.log(data);
let is = dataStore.editFormData[1].options.some((item: any) => {
console.log(item.id);
console.log(dataStore.editRuleForm.category_id);
return item.value == dataStore.editRuleForm.category_id;
});
dataStore.editRuleForm.category_id1 = is ? dataStore.editRuleForm.category_id : dataStore.editRuleForm.category_name;
}
};
const handleSelectChangeEmits = (value: any) => {
console.log(value, "========value=========");
dataStore.editRuleForm.category_id = value.id;
};
const convertDateFormat = (dateString: any) => {
const date = new Date(dateString);
const year = date.getFullYear();

View File

@@ -60,7 +60,7 @@ const dataStore = reactive<any>({
//文章分类(搜索条件)
const getArticleClassData = async () => {
const result = await getArticleClassDataApi({ is_show: 0 });
const result = await getArticleClassDataApi();
if (result?.code === 0) {
const { data } = result;
dataStore.formData[1].options = useSearchInfoArray(data);

View File

@@ -53,7 +53,7 @@ export const EDIT_FORM_DATA: FormItem[] = [
prop: "status",
placeholder: "",
type: "radio",
label: "是否启: ",
label: "是否启: ",
options: [
{
label: "是",
@@ -141,7 +141,7 @@ export const EDIT_FORM_DATA1: FormItem[] = [
prop: "status",
placeholder: "",
type: "radio",
label: "是否启: ",
label: "是否启: ",
options: [
{
label: "是",

View File

@@ -195,6 +195,7 @@ const setImgOrVideo = () => {
} else {
dataStore.editFormData = EDIT_FORM_DATA1;
}
getBannerClassEditList();
};
// 详情
const getBannerRead = async (id: any) => {
@@ -204,6 +205,7 @@ const getBannerRead = async (id: any) => {
if (result?.code === 0) {
dataStore.editRuleForm = result?.data;
setImgOrVideo();
if (dataStore.editRuleForm.link && dataStore.editRuleForm.link_to) {
let { id, name, link } = dataStore.editRuleForm.link_echo_data;
let obj: any = {
@@ -252,7 +254,7 @@ const getBannerUp = async () => {
// 分类
const getBannerClassList = async () => {
const result = await getBannerClassListApi({ is_show: 0 });
const result = await getBannerClassListApi();
if (result?.code === 0) {
let arr: any = [];
result?.data?.forEach((item: any) => {
@@ -265,16 +267,16 @@ const getBannerClassList = async () => {
getBannerClassList();
//详情里的分类
const getBannerClassEditList = async () => {
const result = await getBannerClassListApi({ is_show: 1 });
const result = await getBannerClassListApi();
if (result?.code === 0) {
let arr: any = [];
result?.data?.forEach((item: any) => {
arr.push({ value: item.id, label: item.name });
});
dataStore.editFormData[4].options = arr;
dataStore.editFormData[5].options = arr;
}
};
getBannerClassEditList();
// 新增 getBannerListSave
const getBannerListSave = async () => {
const result = await getBannerListSaveApi(dataStore.editRuleForm);
@@ -329,6 +331,7 @@ const handleResetClick = () => {
const handleAdd = () => {
dataStore.title = "添加Banner";
dataStore.visible = true;
getBannerClassEditList();
};
// 抽屉关闭前的钩子
const handleBeforeClone = () => {

View File

@@ -27,7 +27,7 @@ export const EDIT_FORM_DATA: FormItem[] = [
},
{
prop: "category_id",
prop: "category_id1",
placeholder: "请选择",
type: "select",
label: "下载分类: ",

View File

@@ -1,5 +1,5 @@
export const RULES = {
name: [{ required: true, message: "下载名称不能为空 ! ", trigger: "blur" }],
category_id: [{ required: true, message: "下载分类不能为空 ! ", trigger: "blur" }],
category_id1: [{ required: true, message: "下载分类不能为空 ! ", trigger: "blur" }],
sort: [{ required: true, message: "下载排序不能为空 ! ", trigger: "blur" }]
};

View File

@@ -11,6 +11,7 @@
:formData="dataStore.editFormData"
:rules="dataStore.rules"
ref="formRef"
@handleSelectChangeEmits="handleSelectChangeEmits"
>
<el-button type="primary" size="small" style="margin-bottom: 10px" @click="handleEditAdd">添加行</el-button>
<FormTable :columns="dataStore.editColumns" :tableData="dataStore.editTableData" :height="200">
@@ -228,10 +229,20 @@ const getAttachmentRead = async () => {
if (result?.code === 0) {
dataStore.editRuleForm = result?.data;
dataStore.editTableData = result?.data.attach;
let is = dataStore.editFormData[1].options.some((item: any) => {
console.log(item.id);
console.log(dataStore.editRuleForm.category_id);
return item.value == dataStore.editRuleForm.category_id;
});
dataStore.editRuleForm.category_id1 = is ? dataStore.editRuleForm.category_id : dataStore.editRuleForm.category_name;
}
};
getAttachmentRead();
const handleSelectChangeEmits = (value: any) => {
console.log(value, "========value=========");
dataStore.editRuleForm.category_id = value.id;
};
//分类
const getCategorys = async () => {
const result = await getCategorysApi({ is_show: 1 });

View File

@@ -151,7 +151,7 @@ const handleInput = (row: any) => {
row.sort = integerRexg(row.sort);
};
const getCategorys = async () => {
const result = await getCategorysApi({ is_show: 0 });
const result = await getCategorysApi();
if (result?.code === 0) {
let arr: any[] = [];

View File

@@ -47,7 +47,7 @@ const dataStore = reactive<any>({
});
//分类列表
const getCategorys = async () => {
const result = await getCategorysApi();
const result = await getCategorysApi({ is_show: 0 });
if (result?.code === 0) {
let arr: any[] = [];

View File

@@ -16,11 +16,12 @@
<el-tree-select
clearable
v-model="_ruleFormParam.category_id"
v-model="_ruleFormParam.category_id1"
:data="options"
:render-after-expand="false"
show-checkbox
check-strictly
@change="handleTreeChange()"
/>
</el-form-item>
@@ -59,12 +60,12 @@
<el-radio :value="0" :label="0"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="是否启用" style="width: 440px">
<!-- <el-form-item label="是否启用" style="width: 440px">
<el-radio-group v-model="_ruleFormParam.status">
<el-radio :value="1" :label="1"></el-radio>
<el-radio :value="0" :label="0"></el-radio>
</el-radio-group>
</el-form-item>
</el-form-item> -->
<el-form-item label="SEO标题">
<el-input v-model="_ruleFormParam.seo_title" style="width: 440px" />
</el-form-item>
@@ -95,6 +96,11 @@ const reset = () => {
};
let _ruleFormParam: any = computed(() => props.data);
const handleTreeChange = () => {
_ruleFormParam.value.category_id = _ruleFormParam.value.category_id1;
};
// 暴露给父组件的参数和方法(外部需要什么,都可以从这里暴露出去)
defineExpose({
ruleForm: _ruleFormParam,

View File

@@ -113,7 +113,7 @@ export const BASIC_INFO_FORM_DATA: FormItem[] = [
prop: "is_show1",
placeholder: "",
type: "radio",
label: "是否启: ",
label: "是否启: ",
options: [
{
label: "是",

View File

@@ -43,8 +43,13 @@
<script setup lang="ts" name="productEditIndex">
import { ref, reactive } from "vue";
//getProductAttrsApi
import { getProductDetailsApi, getProductListApi, getProductAttrsListApi } from "@/api/modules/productList";
import { getProductCategoryListApi } from "@/api/modules/productClass";
import {
getProductDetailsApi,
getProductListApi,
getProductAttrsListApi,
getProductCategoryListApi
} from "@/api/modules/productList";
// import { getProductCategoryListApi } from "@/api/modules/productClass";
import { RELATED_INFO_COLUMNS } from "./constant/related";
import { cloneDeep, debounce } from "lodash-es";
import { messageBox } from "@/utils/messageBox";
@@ -123,7 +128,7 @@ const getProductList = async (query: any) => {
//产品分类(后端大佬说直接掉列表接口)
const getProductCategoryList = async () => {
const result = await getProductCategoryListApi({ page: 1, size: 500 });
const result = await getProductCategoryListApi({ is_show: 1 });
if (result?.code === 0) {
let dataClone: any = cloneDeep(result?.data);
dataStore.options = addLabelValue(dataClone);

View File

@@ -1,13 +1,33 @@
import { cloneDeep } from "lodash-es";
const hasIdRecursive = (data: any, targetId: any) => {
for (let i = 0; i < data.length; i++) {
const item = data[i];
if (item.id === targetId) {
return true;
}
if (item.children && item.children.length > 0) {
if (hasIdRecursive(item.children, targetId)) {
return true;
}
}
}
return false;
};
//将参数分离
export const initDetailParams = (dataStore: any, data: any) => {
let is = hasIdRecursive(dataStore.options, data.category_id);
//基本信息
dataStore.basicInfoRuleForm = cloneDeep({
name: data.name,
short_name: data.short_name,
spu: data.spu,
is: is,
category_id1: is ? data.category_id : data.category_name,
category_id: data.category_id,
params: data.category_id,
category_name: data.category_name,
params: data.params,
sort: data.sort,
is_show: data.is_show,
is_new: data.is_new,

View File

@@ -26,7 +26,7 @@ export const EDIT_FORM_DATA: FormItem[] = [
},
{
prop: "category_id",
prop: "category_id1",
placeholder: "请选择",
type: "select",
label: "视频分类: ",

View File

@@ -1,5 +1,5 @@
export const RULES = {
name: [{ required: true, message: "视频名称不能为空 ! ", trigger: "blur" }],
category_id: [{ required: true, message: "视频分类不能为空 ! ", trigger: "blur" }],
category_id1: [{ required: true, message: "视频分类不能为空 ! ", trigger: "blur" }],
sort: [{ required: true, message: "视频排序不能为空 ! ", trigger: "blur" }]
};

View File

@@ -43,6 +43,7 @@
:formData="dataStore.editFormData"
:rules="dataStore.rules"
ref="formRef"
@handleSelectChangeEmits="handleSelectChangeEmits"
>
</rulesForm>
</div>
@@ -125,7 +126,7 @@ const handleResetClick = () => {
//视频分类接口
const getVideoClassList = async () => {
const result = await getVideoClassListApi({ is_show: 0 });
const result = await getVideoClassListApi();
if (result?.code === 0) {
let arr: any[] = [];
if (result?.data?.length) {
@@ -136,7 +137,7 @@ const getVideoClassList = async () => {
};
arr.push(obj);
});
dataStore.formData[1].options = dataStore.editFormData[1].options = arr;
dataStore.formData[1].options = arr;
}
}
};
@@ -176,8 +177,20 @@ const getVideoRead = async (id: any) => {
const result = await getVideoReadApi(id);
if (result?.code === 0) {
dataStore.editRuleForm = result?.data;
let is = dataStore.editFormData[1].options.some((item: any) => {
console.log(item.id);
console.log(dataStore.editRuleForm.category_id);
return item.value == dataStore.editRuleForm.category_id;
});
dataStore.editRuleForm.category_id1 = is ? dataStore.editRuleForm.category_id : dataStore.editRuleForm.category_name;
}
};
const handleSelectChangeEmits = (value: any) => {
console.log(value, "========value=========");
dataStore.editRuleForm.category_id = value.id;
};
//保存
const getVideoSave = async () => {
const result = await getVideoSaveApi(dataStore.editRuleForm);