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>
<script type="module" src="/src/main.ts"></script> <script type="module" src="/src/main.ts"></script>
<script> <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>
</body> </body>
</html> </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 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 }); 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); return http.get<any>(`/attachment/categorys`, params);
}; };

View File

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

View File

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

View File

@@ -124,7 +124,13 @@
<UploadVideo width="440px" v-model:video-url="_ruleForm[`${item.prop}`]"> </UploadVideo> <UploadVideo width="440px" v-model:video-url="_ruleForm[`${item.prop}`]"> </UploadVideo>
</template> </template>
<template v-if="item.type === 'select'"> <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 <el-option
:label="option.label" :label="option.label"
:value="option.value" :value="option.value"

View File

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

View File

@@ -1,5 +1,5 @@
export const RULES = { export const RULES = {
title: [{ required: true, message: "文章名称不能为空 ! ", trigger: "blur" }], 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" }] sort: [{ required: true, message: "文章排序不能为空 ! ", trigger: "blur" }]
}; };

View File

@@ -14,6 +14,7 @@
:formData="dataStore.editFormData" :formData="dataStore.editFormData"
:rules="dataStore.rules" :rules="dataStore.rules"
ref="formRef" ref="formRef"
@handleSelectChangeEmits="handleSelectChangeEmits"
/> />
</el-tab-pane> </el-tab-pane>
@@ -80,9 +81,19 @@ const getArticleListDetails = async () => {
const { data } = result; const { data } = result;
dataStore.editRuleForm = data; dataStore.editRuleForm = data;
console.log(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 convertDateFormat = (dateString: any) => {
const date = new Date(dateString); const date = new Date(dateString);
const year = date.getFullYear(); const year = date.getFullYear();

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,5 +1,5 @@
export const RULES = { export const RULES = {
name: [{ required: true, message: "下载名称不能为空 ! ", trigger: "blur" }], 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" }] sort: [{ required: true, message: "下载排序不能为空 ! ", trigger: "blur" }]
}; };

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,13 +1,33 @@
import { cloneDeep } from "lodash-es"; 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) => { export const initDetailParams = (dataStore: any, data: any) => {
let is = hasIdRecursive(dataStore.options, data.category_id);
//基本信息 //基本信息
dataStore.basicInfoRuleForm = cloneDeep({ dataStore.basicInfoRuleForm = cloneDeep({
name: data.name, name: data.name,
short_name: data.short_name, short_name: data.short_name,
spu: data.spu, spu: data.spu,
is: is,
category_id1: is ? data.category_id : data.category_name,
category_id: data.category_id, category_id: data.category_id,
params: data.category_id, category_name: data.category_name,
params: data.params,
sort: data.sort, sort: data.sort,
is_show: data.is_show, is_show: data.is_show,
is_new: data.is_new, is_new: data.is_new,

View File

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

View File

@@ -1,5 +1,5 @@
export const RULES = { export const RULES = {
name: [{ required: true, message: "视频名称不能为空 ! ", trigger: "blur" }], 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" }] sort: [{ required: true, message: "视频排序不能为空 ! ", trigger: "blur" }]
}; };

View File

@@ -43,6 +43,7 @@
:formData="dataStore.editFormData" :formData="dataStore.editFormData"
:rules="dataStore.rules" :rules="dataStore.rules"
ref="formRef" ref="formRef"
@handleSelectChangeEmits="handleSelectChangeEmits"
> >
</rulesForm> </rulesForm>
</div> </div>
@@ -125,7 +126,7 @@ const handleResetClick = () => {
//视频分类接口 //视频分类接口
const getVideoClassList = async () => { const getVideoClassList = async () => {
const result = await getVideoClassListApi({ is_show: 0 }); const result = await getVideoClassListApi();
if (result?.code === 0) { if (result?.code === 0) {
let arr: any[] = []; let arr: any[] = [];
if (result?.data?.length) { if (result?.data?.length) {
@@ -136,7 +137,7 @@ const getVideoClassList = async () => {
}; };
arr.push(obj); 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); const result = await getVideoReadApi(id);
if (result?.code === 0) { if (result?.code === 0) {
dataStore.editRuleForm = result?.data; 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 getVideoSave = async () => {
const result = await getVideoSaveApi(dataStore.editRuleForm); const result = await getVideoSaveApi(dataStore.editRuleForm);