bug fixed

This commit is contained in:
cxc
2022-11-25 17:30:10 +08:00
parent 69d6c487ac
commit a7a8f21d11
33 changed files with 1700 additions and 558 deletions

View File

@ -1,51 +1,52 @@
import request from '@/utils/request'
// 实验室筛选信息
export function laboratorySelect(data) {
return request({
url: '/admin/v1/laboratory/select',
method: 'post',
data,
})
}
import request from "@/utils/request";
// 实验室列表
export function laboratoryList(data) {
return request({
url: '/admin/v1/manage/laboratory',
method: 'post',
data,
})
export function casLaboratoryList(params) {
return request({
url: "/business/casLaboratory/list",
method: "GET",
params,
});
}
// // 实验室信息添加
// export function laboratoryAdd(data) {
// return request({
// url: '/admin/v1/manage/laboratory/add',
// method: 'post',
// data,
// })
// }
// 实验室详细信息
export function laboratoryDetail(data) {
return request({
url: '/admin/v1/manage/laboratory/detail',
method: 'post',
data,
})
// 新增
export function casLaboratoryAdd(data) {
return request({
url: "/business/casLaboratory",
method: "POST",
data,
});
}
// 实验室信息修改
export function laboratoryEdit(data) {
return request({
url: '/admin/v1/manage/laboratory/edit',
method: 'post',
data,
})
// 修改
export function casLaboratoryUpdate(data) {
return request({
url: "/business/casLaboratory",
method: "PUT",
data,
});
}
// 实验室审核操作
export function laboratoryExamine(data) {
return request({
url: '/admin/v1/manage/laboratory/examine',
method: 'post',
data,
})
// id详情
export function casLaboratoryDetail(id) {
return request({
url: `/business/casLaboratory/${id}`,
method: "GET",
});
}
// 删除
export function casLaboratoryDelete(id) {
return request({
url: `/business/casLaboratory`,
method: "DELETE",
data: {
ids: [id],
},
});
}
// 导入
export function casLaboratoryImportData(data) {
return request({
url: `/business/casLaboratory/importData`,
method: "POST",
data,
});
}

View File

@ -18,6 +18,7 @@
:mode="mode"
@onCreated="handleCreated"
@onChange="handleChange"
@onBlur="emitBlur"
/>
</div>
</template>
@ -142,13 +143,16 @@ export default {
};
const handleChange = (editor) => {
if (editor.getHtml() === "<p><br></p>") {
if (editor.isEmpty()) {
context.emit("update:modelValue", "");
} else {
context.emit("update:modelValue", editor.getHtml());
}
};
const emitBlur = () => {
context.emit("blur", editorRef.value);
// editorRef.value.emit("blur");
};
return {
editorRef,
valueHtml,
@ -158,6 +162,7 @@ export default {
height,
handleCreated,
handleChange,
emitBlur,
};
},
};

View File

@ -40,6 +40,28 @@ export const enterpriseOptions = [
{ key: "104", value: "高新技术企业" },
{ key: "105", value: "科技企业" },
];
// 需求类型
export const demandCategoryList = [
{ id: 1, name: "基金对接" },
{ id: 2, name: "贷款" },
{ id: 3, name: "对接专家院士" },
{ id: 4, name: "人才培养" },
{ id: 5, name: "一带一路国际合作" },
{ id: 6, name: "上市辅导" },
{ id: 7, name: "成果产业化" },
{ id: 8, name: "国家级科研平台合作" },
{ id: 9, name: "研发项目立项评估" },
{ id: 10, name: "科技查新" },
{ id: 11, name: "产业链上下游对接" },
{ id: 12, name: "委托研发" },
{ id: 13, name: "对接政府项目落地" },
{ id: 14, name: "技术咨询" },
{ id: 15, name: "高价值专利培育" },
{ id: 16, name: "知识产权布局" },
{ id: 17, name: "设立院士工作站" },
{ id: 18, name: "海外留学生培养" },
];
// 成果成熟度 技术
export const maturityOptions = [
{ key: "1", value: "正在研发" },

View File

@ -1,183 +1,267 @@
import axios from 'axios'
import { ElNotification , ElMessageBox, ElMessage, ElLoading } from 'element-plus'
import { getToken } from '@/utils/auth'
import errorCode from '@/utils/errorCode'
import { tansParams, blobValidate } from '@/utils/ruoyi'
import cache from '@/plugins/cache'
import { saveAs } from 'file-saver'
import useUserStore from '@/store/modules/user'
import axios from "axios";
import {
ElNotification,
ElMessageBox,
ElMessage,
ElLoading,
} from "element-plus";
import { getToken } from "@/utils/auth";
import errorCode from "@/utils/errorCode";
import { tansParams, blobValidate } from "@/utils/ruoyi";
import cache from "@/plugins/cache";
import { saveAs } from "file-saver";
import useUserStore from "@/store/modules/user";
let downloadLoadingInstance;
// 是否显示重新登录
export let isRelogin = { show: false };
axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
axios.defaults.headers["Content-Type"] = "application/json;charset=utf-8";
// 创建axios实例
const service = axios.create({
// axios中请求配置有baseURL选项表示请求URL公共部分
baseURL: import.meta.env.VITE_APP_BASE_API,
// 超时
timeout: 10000
})
timeout: 10000,
});
// request拦截器
service.interceptors.request.use(config => {
// 是否需要设置 token
const isToken = (config.headers || {}).isToken === false
// 是否需要防止数据重复提交
const isRepeatSubmit = (config.headers || {}).repeatSubmit === false
if (getToken() && !isToken) {
config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
}
// get请求映射params参数
if (config.method === 'get' && config.params) {
let url = config.url + '?' + tansParams(config.params);
url = url.slice(0, -1);
config.params = {};
config.url = url;
}
if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {
const requestObj = {
url: config.url,
data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,
time: new Date().getTime()
service.interceptors.request.use(
(config) => {
// 是否需要设置 token
const isToken = (config.headers || {}).isToken === false;
// 是否需要防止数据重复提交
const isRepeatSubmit = (config.headers || {}).repeatSubmit === false;
if (getToken() && !isToken) {
config.headers["Authorization"] = "Bearer " + getToken(); // 让每个请求携带自定义token 请根据实际情况自行修改
}
const sessionObj = cache.session.getJSON('sessionObj')
if (sessionObj === undefined || sessionObj === null || sessionObj === '') {
cache.session.setJSON('sessionObj', requestObj)
} else {
const s_url = sessionObj.url; // 请求地址
const s_data = sessionObj.data; // 请求数据
const s_time = sessionObj.time; // 请求时间
const interval = 1000; // 间隔时间(ms),小于此时间视为重复提交
if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {
const message = '数据正在处理,请勿重复提交';
console.warn(`[${s_url}]: ` + message)
return Promise.reject(new Error(message))
// get请求映射params参数
if (config.method === "get" && config.params) {
let url = config.url + "?" + tansParams(config.params);
url = url.slice(0, -1);
config.params = {};
config.url = url;
}
if (
!isRepeatSubmit &&
(config.method === "post" || config.method === "put")
) {
const requestObj = {
url: config.url,
data:
typeof config.data === "object"
? JSON.stringify(config.data)
: config.data,
time: new Date().getTime(),
};
const sessionObj = cache.session.getJSON("sessionObj");
if (
sessionObj === undefined ||
sessionObj === null ||
sessionObj === ""
) {
cache.session.setJSON("sessionObj", requestObj);
} else {
cache.session.setJSON('sessionObj', requestObj)
const s_url = sessionObj.url; // 请求地址
const s_data = sessionObj.data; // 请求数据
const s_time = sessionObj.time; // 请求时间
const interval = 1000; // 间隔时间(ms),小于此时间视为重复提交
if (
s_data === requestObj.data &&
requestObj.time - s_time < interval &&
s_url === requestObj.url
) {
const message = "数据正在处理,请勿重复提交";
console.warn(`[${s_url}]: ` + message);
return Promise.reject(new Error(message));
} else {
cache.session.setJSON("sessionObj", requestObj);
}
}
}
return config;
},
(error) => {
console.log(error);
Promise.reject(error);
}
return config
}, error => {
console.log(error)
Promise.reject(error)
})
);
// 响应拦截器
service.interceptors.response.use(res => {
service.interceptors.response.use(
(res) => {
// 未设置状态码则默认成功状态
const code = res.data.code || 200;
// 获取错误信息
const msg = errorCode[code] || res.data.msg || errorCode['default']
const msg = errorCode[code] || res.data.msg || errorCode["default"];
// 二进制数据则直接返回
if(res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer'){
return res.data
if (
res.request.responseType === "blob" ||
res.request.responseType === "arraybuffer"
) {
return res.data;
}
if (code === 401) {
if (!isRelogin.show) {
isRelogin.show = true;
ElMessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', {
confirmButtonText: '重新登录',
cancelButtonText: '取消',
type: 'warning'
}
).then(() => {
isRelogin.show = false;
useUserStore().logOut().then(() => {
location.href = '/index';
})
}).catch(() => {
isRelogin.show = false;
});
}
return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
ElMessageBox.confirm(
"登录状态已过期,您可以继续留在该页面,或者重新登录",
"系统提示",
{
confirmButtonText: "重新登录",
cancelButtonText: "取消",
type: "warning",
}
)
.then(() => {
isRelogin.show = false;
useUserStore()
.logOut()
.then(() => {
location.href = "/index";
});
})
.catch(() => {
isRelogin.show = false;
});
}
return Promise.reject("无效的会话,或者会话已过期,请重新登录。");
} else if (code === 500) {
ElMessage({
message: msg,
type: 'error'
})
return Promise.reject(new Error(msg))
type: "error",
});
return Promise.reject(new Error(msg));
} else if (code !== 200) {
ElNotification.error({
title: msg
})
return Promise.reject('error')
title: msg,
});
return Promise.reject("error");
} else {
return Promise.resolve(res.data)
return Promise.resolve(res.data);
}
},
error => {
console.log('err' + error)
(error) => {
console.log("err" + error);
let { message } = error;
if (message == "Network Error") {
message = "后端接口连接异常";
}
else if (message.includes("timeout")) {
} else if (message.includes("timeout")) {
message = "系统接口请求超时";
}
else if (message.includes("Request failed with status code")) {
} else if (message.includes("Request failed with status code")) {
message = "系统接口" + message.substr(message.length - 3) + "异常";
}
ElMessage({
message: message,
type: 'error',
duration: 5 * 1000
})
return Promise.reject(error)
type: "error",
duration: 5 * 1000,
});
return Promise.reject(error);
}
)
);
// 通用下载方法
export function download(url, params, filename) {
downloadLoadingInstance = ElLoading.service({ text: "正在下载数据,请稍候", background: "rgba(0, 0, 0, 0.7)", })
return service.post(url, params, {
transformRequest: [(params) => { return tansParams(params) }],
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
responseType: 'blob'
}).then(async (data) => {
const isLogin = await blobValidate(data);
if (isLogin) {
const blob = new Blob([data])
saveAs(blob, filename)
} else {
const resText = await data.text();
const rspObj = JSON.parse(resText);
const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
ElMessage.error(errMsg);
}
downloadLoadingInstance.close();
}).catch((r) => {
console.error(r)
ElMessage.error('下载文件出现错误,请联系管理员!')
downloadLoadingInstance.close();
})
}
export function customDownload(url, params, filename) {
downloadLoadingInstance = ElLoading.service({ text: "正在下载数据,请稍候", background: "rgba(0, 0, 0, 0.7)", })
return service.get(url, params, {
baseURL:"",
transformRequest: [(params) => { return tansParams(params) }],
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
responseType: 'blob'
}).then(async (data) => {
const isLogin = await blobValidate(data);
if (isLogin) {
const blob = new Blob([data])
saveAs(blob, filename)
} else {
const resText = await data.text();
const rspObj = JSON.parse(resText);
const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
ElMessage.error(errMsg);
}
downloadLoadingInstance.close();
}).catch((r) => {
console.error(r)
ElMessage.error('下载文件出现错误,请联系管理员!')
downloadLoadingInstance.close();
})
downloadLoadingInstance = ElLoading.service({
text: "正在下载数据,请稍候",
background: "rgba(0, 0, 0, 0.7)",
});
return service
.post(url, params, {
transformRequest: [
(params) => {
return tansParams(params);
},
],
headers: { "Content-Type": "application/x-www-form-urlencoded" },
responseType: "blob",
})
.then(async (data) => {
const isLogin = await blobValidate(data);
if (isLogin) {
const blob = new Blob([data]);
console.log(blob);
saveAs(blob, filename);
} else {
const resText = await data.text();
const rspObj = JSON.parse(resText);
const errMsg =
errorCode[rspObj.code] || rspObj.msg || errorCode["default"];
ElMessage.error(errMsg);
}
downloadLoadingInstance.close();
})
.catch((r) => {
console.error(r);
ElMessage.error("下载文件出现错误,请联系管理员!");
downloadLoadingInstance.close();
});
}
export default service
export const downloadFile = async (url, filename) => {
downloadLoadingInstance = ElLoading.service({
text: "正在下载数据,请稍候",
background: "rgba(0, 0, 0, 0.7)",
});
try {
const { data } = await axios.get(url, {
responseType: "blob",
});
const isBlob = await blobValidate(data);
if (isBlob) {
const blob = new Blob([data]);
saveAs(blob, filename);
} else {
const resText = await data.text();
const rspObj = JSON.parse(resText);
const errMsg =
errorCode[rspObj.code] || rspObj.msg || errorCode["default"];
ElMessage.error(errMsg);
}
downloadLoadingInstance.close();
} catch (error) {
console.error(error);
ElMessage.error("下载文件出现错误,请联系管理员!");
downloadLoadingInstance.close();
}
};
export async function customDownload(url, params, filename) {
downloadLoadingInstance = ElLoading.service({
text: "正在下载数据,请稍候",
background: "rgba(0, 0, 0, 0.7)",
});
try {
const data = await service.get(url, params, {
baseURL: "",
transformRequest: [
(params_1) => {
return tansParams(params_1);
},
],
headers: { "Content-Type": "application/x-www-form-urlencoded" },
responseType: "blob",
});
console.log(data);
const isLogin = await blobValidate(data);
if (isLogin) {
const blob = new Blob([data]);
console.log(blob);
saveAs(blob, filename);
} else {
const resText = await data.text();
const rspObj = JSON.parse(resText);
const errMsg =
errorCode[rspObj.code] || rspObj.msg || errorCode["default"];
ElMessage.error(errMsg);
}
downloadLoadingInstance.close();
} catch (r) {
console.error(r);
ElMessage.error("下载文件出现错误,请联系管理员!");
downloadLoadingInstance.close();
}
}
export default service;

View File

@ -32,13 +32,13 @@
<el-option :value="103" label="普通企业" />
</el-select>
</el-form-item>
<el-form-item label="站点">
<!-- <el-form-item label="站点">
<site-options
v-model="queryData.tenantId"
:site-list="siteList"
style="width: 160px"
/>
</el-form-item>
</el-form-item> -->
<el-form-item style="float: right">
<el-button
@ -63,11 +63,11 @@
<div>{{ row.industrys[row.industrys.length - 1] }}</div>
</template>
</el-table-column>
<el-table-column prop="" label="站点" align="center">
<!-- <el-table-column prop="" label="站点" align="center">
<template #default="{ row }">
{{ siteList.find((el) => el.id === row.tenantId)?.name ?? "无" }}
</template>
</el-table-column>
</el-table-column> -->
<el-table-column prop="address" label="所在地" align="center" />
<el-table-column prop="examineStatus" label="审核状态" align="center">
<template #default="{ row }">
@ -150,7 +150,7 @@ const router = useRouter();
const total = ref(0);
const dataList = ref([]);
const { queryData, setTypeRow } = toRefs(data);
const siteList = ref([]);
// const siteList = ref([]);
const isShow = ref(false);
const radioList = ref("");
const examineStatusDict = {
@ -166,11 +166,11 @@ const getList = async () => {
dataList.value = res.rows;
total.value = res.total;
};
// 获取站点列表
const getSiteList = async () => {
const resp = await tenantSelect();
siteList.value = resp.rows;
};
// // 获取站点列表
// const getSiteList = async () => {
// const resp = await tenantSelect();
// siteList.value = resp.rows;
// };
// 搜索查询
const handleQuery = () => {
getList(queryData.value);
@ -217,6 +217,6 @@ const handleDetail = (id) => {
});
};
getList();
getSiteList();
// getSiteList();
</script>
<style></style>

View File

@ -148,8 +148,8 @@
import CityOptions from "@/views/components/CityOptions";
import FieldOptions from "@/views/components/FieldOptions";
import InputBoxAdd from "@/views/components/InputBoxAdd";
import { researchSelect } from "@/api/dataList/research";
import { laboratorySelect } from "@/api/dataList/laboratory";
// import { researchSelect } from "@/api/dataList/research";
// import { laboratorySelect } from "@/api/dataList/laboratory";
export default {
components: {
CityOptions,

View File

@ -98,6 +98,7 @@
</template>
<script setup>
import Editor from "@/components/WangEditor";
import { demandCategoryList } from "@/utils/parameter";
import { ref, toRefs } from "vue";
const props = defineProps({
isShow: {
@ -110,23 +111,6 @@ const props = defineProps({
},
});
const { isShow, modelValue } = toRefs(props);
const checkList = reactive([
{
id: 1,
name: "成果推广",
},
{
id: 2,
name: "关键成果解决",
},
{
id: 3,
name: "对接专家院士",
},
{
id: 4,
name: "上市辅导",
},
]);
const checkList = reactive(demandCategoryList);
</script>
<style></style>

View File

@ -1,6 +1,6 @@
<!-- 企业需求弹框 -->
<template>
<el-dialog title="基本信息" v-model="isShow">
<el-dialog title="基本信息" :model-value="isShow" @close="close">
<el-form
ref="formRef"
:model="modelValue"
@ -10,13 +10,13 @@
<p><b>基本信息</b></p>
<el-row>
<el-col :span="24">
<el-form-item label="成果需求名称:" prop="title">
<el-form-item label="技术需求名称:" prop="title">
<el-input v-model="modelValue.title"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-row v-if="false">
<el-col :span="24">
<!-- <el-checkbox label="0" @change="handleCheck">其他</el-checkbox> -->
<el-form-item label="需求类别:">
@ -46,11 +46,6 @@
</el-col>
</el-row>
<!-- <CityOptions
v-model="form"
:labelWidth="labelWidth"
ref="cityForm"
/> -->
<FieldOptions
v-model="modelValue"
:labelWidth="labelWidth"
@ -58,10 +53,17 @@
ref="fieldFormRef"
/>
<CityOptions
disabled
v-model="modelValue"
:labelWidth="labelWidth"
ref="cityFormRef"
/>
<el-row>
<el-col :span="12">
<el-form-item
label="成果需求预算:"
label="技术需求预算:"
:prop="modelValue.budgetMode == 1 ? 'budget' : ''"
>
<el-input
@ -160,7 +162,9 @@
</template>
<script setup>
import { updateTechnologyDemand } from "@/api/dataApproval/enterpriseTechnologyDemand";
import { demandCategoryList } from "@/utils/parameter";
import WangEditor from "@/components/WangEditor";
import CityOptions from "@/views/components/CityOptions";
import FieldOptions from "@/views/components/FieldOptions";
import InputBoxAdd from "@/views/components/InputBoxAdd";
import { ElMessage } from "element-plus";
@ -178,30 +182,16 @@ const props = defineProps({
});
const { isShow, modelValue } = toRefs(props);
const labelWidth = 160;
const checkList = reactive([
{
id: 1,
name: "成果推广",
},
{
id: 2,
name: "关键成果解决",
},
{
id: 3,
name: "对接专家院士",
},
{
id: 4,
name: "上市辅导",
},
]);
const checkList = reactive(demandCategoryList);
const approve = async (status) => {
let title = status == 1 ? "通过" : "驳回";
await updateTechnologyDemand({ id: modelValue.value.id, status });
ElMessage.success(`${title}需求`);
emit("update:is-show", false);
emit("update:isShow", false);
emit("update-list");
};
const close = () => {
emit("update:isShow", false);
};
</script>
<style></style>

View File

@ -158,19 +158,41 @@ const validateForm = async () => {
};
getProvinceList();
watch(
modelValue,
() => modelValue.value.province,
(val) => {
if (val.province) {
getCityListByProvinceId(val.province);
}
if (val.city) {
getAreaListByCityId(val.city);
}
console.log("changed province");
val && getCityListByProvinceId(val);
},
{ deep: true }
{
immediate: true,
}
);
watch(
() => modelValue.value.city,
(val) => {
console.log("changed city");
val && getAreaListByCityId(val);
},
{
immediate: true,
}
);
// watch(
// modelValue,
// (val) => {
// if (val.province) {
// getCityListByProvinceId(val.province);
// }
// if (val.city) {
// getAreaListByCityId(val.city);
// }
// },
// { deep: true }
// );
defineExpose({
validateForm,
});

View File

@ -153,6 +153,7 @@
<script>
import FieldOptions from "@/views/components/FieldOptions";
import InputBoxAdd from "@/views/components/InputBoxAdd";
import { demandCategoryList } from "@/utils/parameter";
export default {
components: {
FieldOptions,
@ -183,24 +184,7 @@ export default {
},
data() {
return {
checkList: [
{
id: 1,
name: "成果推广",
},
{
id: 2,
name: "关键成果解决",
},
{
id: 3,
name: "对接专家院士",
},
{
id: 4,
name: "上市辅导",
},
],
checkList: demandCategoryList,
checkInput: "",
rules: {
title: [
@ -250,4 +234,4 @@ export default {
},
},
};
</script>
</script>

View File

@ -124,13 +124,13 @@
</el-col>
</el-row>
<el-row>
<!-- <el-row>
<el-col :span="24">
<el-form-item label="所属站点:" prop="tenantId">
<SiteOptions v-model="modelValue.tenantId" :site-list="siteList" />
</el-form-item>
</el-col>
</el-row>
</el-row> -->
<!-- <el-row v-if="formType == 1">
<el-col :span="12">
@ -318,15 +318,15 @@
<el-row>
<el-col :span="24">
<el-form-item :label="introduceName" prop="introduce">
<el-input
<!-- <el-input
v-if="formType == 1"
v-model="modelValue.introduce"
type="textarea"
:autosize="{ minRows: 2, maxRows: 6 }"
/>
/> -->
<!-- v-else -->
<WangEditor
:readOnly="!isAdd"
v-else
v-model="modelValue.introduce"
minHeight="150px"
/>
@ -346,13 +346,13 @@
import CityOptions from "@/views/components/CityOptions";
// import FieldOptions from "@/views/components/FieldOptions";
import InputBoxAdd from "@/views/components/InputBoxAdd";
import { researchSelect } from "@/api/dataList/research";
import { laboratorySelect } from "@/api/dataList/laboratory";
// import { researchSelect } from "@/api/dataList/research";
// import { laboratorySelect } from "@/api/dataList/laboratory";
import { tenantSelect } from "@/api/subPlatform/tenant";
import { enterpriseOptions } from "@/utils/parameter";
import { reactive, ref, toRefs } from "vue";
import WangEditor from "../../../components/WangEditor/index.vue";
import SiteOptions from "@/views/components/SiteOptions";
import WangEditor from "@/components/WangEditor/index.vue";
// import SiteOptions from "@/views/components/SiteOptions";
import FieldOptions from "@/views/components/FieldOptions";
const props = defineProps({

View File

@ -292,8 +292,8 @@
import CityOptions from "@/views/components/CityOptions";
// import FieldOptions from "@/views/components/FieldOptions";
import InputBoxAdd from "@/views/components/InputBoxAdd";
import { researchSelect } from "@/api/dataList/research";
import { laboratorySelect } from "@/api/dataList/laboratory";
// import { researchSelect } from "@/api/dataList/research";
// import { laboratorySelect } from "@/api/dataList/laboratory";
import { tenantSelect } from "@/api/subPlatform/tenant";
import { enterpriseOptions } from "@/utils/parameter";
import { reactive, ref, toRefs } from "vue";

View File

@ -70,7 +70,7 @@
<el-tag
v-for="(tag, index) in industrysTags"
:key="index"
closable
:closable="!disabled"
@close="handleFieldClose(index)"
>
{{ getFieldNameById(tag) }}
@ -216,7 +216,7 @@ watch(
modelValue,
(newVal) => {
modelValue.value.industrys = [];
console.log(modelValue.value.industry ? 1 : 0);
// console.log(modelValue.value.industry ? 1 : 0);
let industrysList = modelValue.value.industry
? modelValue.value.industry.split(",")
: [];

View File

@ -31,7 +31,7 @@
<el-tag
v-for="(tag, index) in modelValue[fieldKey]"
:key="index"
closable
:closable="!disabled"
@close="handleFieldClose(fieldKey, index)"
>
{{ tag }}
@ -77,8 +77,8 @@ const dataVal = ref("");
const formRef = ref(null);
const keyWordAdd = () => {
if (!dataVal.value.length) return ElMessage.error(`请输入${title.value}`);
if(!modelValue.value[fieldKey.value]){
modelValue.value[fieldKey.value]=[]
if (!modelValue.value[fieldKey.value]) {
modelValue.value[fieldKey.value] = [];
}
modelValue.value[fieldKey.value].push(dataVal.value);
dataVal.value = "";

View File

@ -1,7 +1,7 @@
<template>
<el-form
ref="form"
:model="value"
ref="formRef"
:model="modelValue"
:rules="rules"
:label-width="labelWidth + 'px'"
>
@ -9,84 +9,65 @@
<el-row>
<el-col :span="24">
<el-form-item label="实验室名称" prop="name">
<el-input v-model="value.name" :disabled="!isAdd"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="组织机构代码:" prop="code">
<el-row type="flex" justify="space-between">
<el-col :span="20">
<el-input v-model="value.code" :disabled="!isAdd"></el-input>
</el-col>
<el-col :span="3">
<el-button type="primary" @click="" :disabled="!isAdd"
>查找</el-button
>
</el-col>
</el-row>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="所属站点:" prop="tenant_id">
<SiteOptions :size="''" :limitWidth="false" v-model="value" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="所属单位:" prop="research_id">
<el-select
v-model="value.research_id"
filterable
placeholder="请选择"
>
<el-option
v-for="item in researchOptions"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<CityOptions v-model="value" :labelWidth="labelWidth" ref="cityForm" />
<el-row>
<el-col :span="24">
<el-form-item label="详细地址:">
<el-input
v-model="value.address"
placeholder="请输入详细地址"
v-model="modelValue.name"
placeholder="请输入实验室全称"
:disabled="!isAdd"
></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="所属单院所或高校:" prop="school">
<el-input
v-model="modelValue.school"
placeholder="请输入所属单院所或高校"
></el-input>
<!-- <el-option
v-for="item in researchOptions"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option> -->
</el-form-item>
</el-col>
</el-row>
<!-- <CityOptions v-model="modelValue" :labelWidth="labelWidth" ref="cityForm" /> -->
<!-- <el-row>
<el-col :span="24">
<el-form-item label="详细地址:">
<el-input
v-model="modelValue.address"
placeholder="请输入详细地址"
></el-input>
</el-form-item>
</el-col>
</el-row> -->
<el-row>
<el-col :span="24">
<el-form-item label="实验室网站:">
<el-input
v-model="value.url"
v-model="modelValue.url"
placeholder="请输入实验室网站"
></el-input>
</el-form-item>
</el-col>
</el-row>
<FieldOptions v-model="value" :labelWidth="labelWidth" ref="fieldForm" />
<FieldOptions
v-model="modelValue"
:labelWidth="labelWidth"
ref="fieldFormRef"
/>
<!-- <FieldSingle
v-model="value"
v-model="modelValue"
:isAdd="isAdd"
:labelWidth="labelWidth"
ref="fieldForm"
@ -94,42 +75,231 @@
<InputBoxAdd
:labelWidth="labelWidth"
v-model="value"
v-model="modelValue"
title="关键词"
placeholder="应用场景关键词+技术产品关键词"
fieldKey="keywords"
ref="keywordsForm"
ref="keywordsFormRef"
/>
<InputBoxAdd
<!-- <InputBoxAdd
:labelWidth="labelWidth"
v-model="value"
v-model="modelValue"
title="研究方向"
placeholder="请输入研究方向"
fieldKey="researchs"
ref="directionsForm"
/>
/> -->
<el-row>
<el-col :span="24">
<el-form-item label="实验室简介" prop="introduce">
<Editor
v-model="value.introduce"
:minHeight="150"
ref="introduceRef"
@click.native="handleEditAble"
<el-form-item label="研究方向" prop="researchDirection">
<el-input
v-model="modelValue.researchDirection"
type="textarea"
:autosize="{ minRows: 4 }"
placeholder="请输入研究方向"
></el-input> </el-form-item></el-col
></el-row>
<el-row>
<el-col :span="24">
<el-form-item label="主要技术应用场景" prop="primaryTechnology">
<el-input
v-model="modelValue.primaryTechnology"
type="textarea"
:autosize="{ minRows: 4 }"
placeholder="请输入主要技术应用场景"
></el-input> </el-form-item></el-col
></el-row>
<el-row>
<el-col :span="24">
<el-form-item label="承担科研项目情况" prop="researchProject">
<el-input
v-model="modelValue.researchProject"
type="textarea"
:autosize="{ minRows: 4 }"
placeholder="请输入承担科研项目情况"
></el-input> </el-form-item></el-col
></el-row>
<el-row>
<el-col :span="24">
<el-form-item label="代表性科技成果" prop="achievement">
<el-input
v-model="modelValue.achievement"
type="textarea"
:autosize="{ minRows: 4 }"
placeholder="请输入代表性科技成果"
></el-input> </el-form-item></el-col
></el-row>
<el-row>
<el-col :span="24">
<el-form-item label="联系电话" prop="phone">
<el-input
v-model="modelValue.phone"
maxlength="11"
oninput="value = value.replace(/[\D]+/, '')"
placeholder="请输入联系电话"
></el-input> </el-form-item></el-col
></el-row>
<el-row>
<el-col :span="24">
<el-form-item label="网址" prop="url">
<el-input
placeholder="请输入网址"
v-model="modelValue.url"
></el-input> </el-form-item></el-col
></el-row>
<el-row>
<el-col :span="24">
<el-form-item label="实验室简介" prop="introduction">
<WangEditor
v-model="modelValue.introduction"
minHeight="320px"
ref="introductionRef"
@blur="formRef.validateField(`introduction`)"
/>
<!-- @click.native="handleEditAble" -->
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="核心成员及简介" prop="member">
<WangEditor
v-model="modelValue.member"
minHeight="320px"
ref="memberRef"
@blur="formRef.validateField(`member`)"
/>
<!-- @click.native="handleEditAble" -->
</el-form-item>
</el-col>
</el-row>
</el-form>
</template>
<script>
<script setup>
import CityOptions from "@/views/components/CityOptions";
import FieldSingle from "@/views/components/FieldSingle";
import FieldOptions from "@/views/components/FieldOptions";
import InputBoxAdd from "@/views/components/InputBoxAdd";
import { researchSelect } from "@/api/dataList/research";
import { reactive, ref, toRefs, watch } from "vue";
const props = defineProps({
modelValue: Object,
isAdd: {
type: Boolean,
default: true,
},
showTitle: {
type: Boolean,
default: false,
},
labelWidth: {
type: Number,
default: 120,
},
});
const { modelValue, isAdd, showTitle, labelWidth } = toRefs(props);
const researchOptions = ref([]);
const options = ref([]);
const data = reactive({
rules: {
product: [{ required: true, message: "请输入", trigger: "blur" }],
name: [{ required: true, message: "请输入", trigger: "blur" }],
kind: [{ required: true, message: "请选择", trigger: "change" }],
code: [{ required: true, message: "请输入", trigger: "blur" }],
phone: [
// { required: true, message: "请输入联系电话", trigger: "blur" },
{
pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
message: "请输入正确的手机号码",
trigger: "blur",
},
],
researchId: [{ required: true, message: "请选择", trigger: "change" }],
tenantId: [
{
required: true,
message: "请选择",
trigger: ["blur", "change"],
},
],
school: [{ required: true, message: "请输入", trigger: "blur" }],
education: [{ required: true, message: "请选择", trigger: "change" }],
major: [{ required: true, message: "请输入", trigger: "blur" }],
job: [{ required: true, message: "请输入", trigger: "blur" }],
title: [{ required: true, message: "请输入", trigger: "blur" }],
workAt: [
{
required: true,
message: "从业时间不能为空",
trigger: ["change", "blur"],
},
],
license: [
{
required: true,
message: "请上传",
trigger: ["blur", "change"],
},
],
introduce: [
{ required: true, message: "请输入实验室简介", trigger: "blur" },
],
},
});
const { rules } = toRefs(data);
const formRef = ref();
const fieldFormRef = ref();
const keywordsFormRef = ref();
// watch(modelValue.tenantId, (val) => {
// console.log(val);
// if (val) {
// researchSelect({ tenantId: val }).then(({ data }) => {
// researchOptions.value = data;
// });
// } else {
// researchOptions.value = [];
// if (modelValue.researchId) modelValue.researchId = undefined;
// }
// });
const validateForm = async () => {
let formValid;
try {
formValid = await formRef.value.validate();
} catch (error) {
formValid = false;
}
// const cityFormValid = await cityFormRef.value.validateForm();
const fieldFormValid = await fieldFormRef.value.validateForm();
const keywordsFormValid = await keywordsFormRef.value.validateForm();
return formValid && fieldFormValid && keywordsFormValid;
// if (formType.value == 1) {
// //个人
// // const researchsFormValid = await researchsFormRef.value.validateForm(); //研究方向验证
// } else if (formType.value == 2) {
// //企业
// // const directionsFormValid = await directionsFormRef.value.validateForm(); //生产方向验证
// return (
// formValid && fieldFormValid && fieldFormValid
// // keywordsFormValid &&
// // directionsFormValid
// );
// } else {
// throw "未知的formType";
// }
};
defineExpose({
validateForm,
});
</script>
<!-- <script>
export default {
components: {
CityOptions,
@ -137,82 +307,14 @@ export default {
FieldOptions,
InputBoxAdd,
},
props: {
value: Object,
isAdd: {
type: Boolean,
default: true,
},
showTitle: {
type: Boolean,
default: false,
},
labelWidth: {
type: Number,
default: 120,
},
},
watch: {
"value.tenant_id"(newOld) {
console.log(newOld);
if (newOld) {
researchSelect({ tenant_id: newOld }).then(({ data }) => {
this.researchOptions = data;
});
} else {
this.researchOptions = [];
if (this.value.research_id) this.value.research_id = undefined;
}
},
},
data() {
return {
researchOptions: [],
options: [
// { value: "", label: "" }
],
rules: {
product: [{ required: true, message: "请输入", trigger: "blur" }],
name: [{ required: true, message: "请输入", trigger: "blur" }],
kind: [{ required: true, message: "请选择", trigger: "change" }],
code: [{ required: true, message: "请输入", trigger: "blur" }],
mobile: [
{ required: true, message: "请输入", trigger: "blur" },
{
pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
message: "请输入正确的手机号码",
trigger: "blur",
},
],
research_id: [{ required: true, message: "请选择", trigger: "change" }],
tenant_id: [
{
required: true,
message: "请选择",
trigger: ["blur", "change"],
},
],
school: [{ required: true, message: "请输入", trigger: "blur" }],
education: [{ required: true, message: "请选择", trigger: "change" }],
major: [{ required: true, message: "请输入", trigger: "blur" }],
job: [{ required: true, message: "请输入", trigger: "blur" }],
title: [{ required: true, message: "请输入", trigger: "blur" }],
work_at: [
{
required: true,
message: "从业时间不能为空",
trigger: ["change", "blur"],
},
],
license: [
{
required: true,
message: "请上传",
trigger: ["blur", "change"],
},
],
introduce: [{ required: true, message: "请输入", trigger: "blur" }],
},
};
},
mounted() {
@ -239,7 +341,7 @@ export default {
},
},
};
</script>
</script> -->
<style lang="scss" scoped>
.form_title {
font-weight: 700;
@ -256,4 +358,4 @@ export default {
display: block;
width: 100%;
}
</style>
</style>

View File

@ -39,7 +39,7 @@
</el-form-item>
</el-col>
</el-row>
<el-row>
<!-- <el-row>
<el-col :span="24">
<el-form-item label="邮箱:" prop="email">
<el-input
@ -48,7 +48,7 @@
></el-input>
</el-form-item>
</el-col>
</el-row>
</el-row> -->
<el-row>
<el-col :span="24">
<el-form-item label="产品名称:" prop="title">
@ -239,8 +239,9 @@ import {
cooperationOptions,
} from "@/utils/parameter";
import { useRoute, useRouter } from "vue-router";
import saveAs from "file-saver";
import { ElMessage } from "element-plus";
import { customDownload } from "@/utils/request";
import { customDownload, downloadFile } from "@/utils/request";
// import WangEditor from "@/components/WangEditor/index.vue";
// const isAdd = ref(false);
const route = useRoute();
@ -270,6 +271,7 @@ const getDetail = async (id) => {
form.value.cooperationModeArr = data.cooperationMode
? data.cooperationMode.split(",")
: [];
// form.value.keywords = data.keyword ? data.keyword.split(",") : [];
};
if (route.query.id) {
getDetail(route.query.id);
@ -277,13 +279,15 @@ if (route.query.id) {
const downloadProductImage = () => {
const filename =
form.value.image.split("/")[form.value.image.split("/").length - 1];
customDownload(form.value.image, {}, filename);
// saveAs(form.value.image, filename);
downloadFile(form.value.image, filename);
};
const downloadProductMaterial = () => {
const filename =
form.value.material.split("/")[form.value.material.split("/").length - 1];
const baseUrl = import.meta.env.VITE_APP_BASE_API;
customDownload(`/file${form.value.material}`, {}, filename);
// const baseUrl = import.meta.env.VITE_APP_BASE_API;
// customDownload(`/file${form.value.material}`, {}, filename);
downloadFile(form.value.material, filename);
};
const submitForm = async (status) => {

View File

@ -13,10 +13,10 @@
<el-row>
<el-col :span="24">
<el-form-item label="产品名称:" prop="title">
<el-form-item label="成果名称:" prop="title">
<el-input
v-model="form.title"
placeholder="请输入产品名称"
placeholder="请输入成果名称"
></el-input>
</el-form-item>
</el-col>
@ -38,10 +38,15 @@
fieldKey="customers"
ref="customerFormRef"
/>
<city-options
v-model="form"
disabled
:labelWidth="labelWidth"
ref="cityFormRef"
></city-options>
<el-row>
<el-col :span="24">
<el-form-item label="产品成熟度:" prop="maturity">
<el-form-item label="成果成熟度:" prop="maturity">
<el-select v-model="form.maturity" clearable placeholder="请选择">
<el-option
v-for="item in maturityOptions"
@ -102,10 +107,15 @@
fieldKey="keywords"
ref="keywordsForm"
/>
<el-row>
<el-col :span="24">
<el-form-item label="产品简介:" prop="description">
<el-form-item label="所属单位:" prop="unit">
<el-input v-model="form.unit"></el-input>
</el-form-item> </el-col
></el-row>
<el-row>
<el-col :span="24">
<el-form-item label="成果简介:" prop="description">
<wangEditor
readOnly
v-model="form.description"
@ -118,7 +128,7 @@
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="产品图片:" prop="image">
<el-form-item label="成果图片:" prop="image">
<ImageUpload v-model="form.image" :limit="1" />
</el-form-item>
</el-col>
@ -155,6 +165,7 @@
</div>
</template>
<script setup>
import { demandCategoryList } from "@/utils/parameter";
import CityOptions from "@/views/components/CityOptions";
import FieldOptions from "@/views/components/FieldOptions";
import InputBoxAdd from "@/views/components/InputBoxAdd";
@ -171,6 +182,7 @@ import {
leadOptions,
cooperationOptions,
} from "@/utils/parameter";
import { downloadFile } from "../../../utils/request";
const router = useRouter();
const route = useRoute();
const data = reactive({
@ -180,34 +192,18 @@ const { form } = toRefs(data);
const labelWidth = ref(120);
const checkList = reactive([
{
id: 1,
name: "成果推广",
},
{
id: 2,
name: "关键成果解决",
},
{
id: 3,
name: "对接专家院士",
},
{
id: 4,
name: "上市辅导",
},
]);
const checkList = reactive(demandCategoryList);
const getAchievementInfo = async () => {
const resp = await expertAchievementInfo({ id: route.query.id });
form.value = resp.data;
form.value.keywords = form.value.keyword?.split(",") ?? [];
form.value.customers = form.value.customer?.split(",") ?? [];
};
const downloadImage = () => {
const filename =
form.value.image.split("/")[form.value.image.split("/").length - 1];
customDownload(form.value.image, {}, filename);
downloadFile(form.value.image, filename);
};
const submitForm = async (status) => {

View File

@ -18,7 +18,7 @@
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="6">
<!-- <el-col :span="6">
<el-form-item label="所属站点" prop="tenantId">
<site-options v-model="queryParams.tenantId" :site-list="siteList" />
</el-form-item>
@ -34,7 +34,7 @@
<el-button icon="refresh" size="default" @click="resetQuery"
>重置</el-button
>
</el-col>
</el-col> -->
</el-row>
</el-form>
<el-row>
@ -77,13 +77,13 @@
align="center"
prop=""
></el-table-column> -->
<el-table-column label="站点" align="center">
<!-- <el-table-column label="站点" align="center">
<template #default="{ row }">
{{
siteList.find((el) => el.id === row.tenantId)?.name ?? "无"
}}</template
>
</el-table-column>
</el-table-column> -->
<el-table-column
label="申请时间"
align="center"
@ -145,7 +145,7 @@ const getSiteList = async () => {
const resp = await tenantSelect();
siteList.value = resp.rows;
};
getSiteList();
// getSiteList();
const getList = async () => {
const resp = await expertAchievementList(queryParams.value);

View File

@ -57,11 +57,11 @@
</el-col>
</el-row>
<!-- <CityOptions
v-model="form"
<CityOptions
v-model="modelValue"
:labelWidth="labelWidth"
ref="cityForm"
/> -->
ref="cityFormRef"
/>
<FieldOptions
v-model="modelValue"
:labelWidth="labelWidth"
@ -155,6 +155,7 @@
<script setup>
import { updateExpertAchievement } from "@/api/dataApproval/achivement";
import WangEditor from "@/components/WangEditor";
import { demandCategoryList } from "@/utils/parameter";
import FieldOptions from "@/views/components/FieldOptions";
import InputBoxAdd from "@/views/components/InputBoxAdd";
import { ElMessage } from "element-plus";

View File

@ -89,7 +89,7 @@
align="center"
prop=""
></el-table-column> -->
<el-table-column label="站点" align="center" prop=""></el-table-column>
<!-- <el-table-column label="站点" align="center" prop=""></el-table-column> -->
<el-table-column
label="发布时间"
align="center"
@ -130,7 +130,7 @@
<!-- 审批详情 -->
<Edialog
v-model:is-show="isShow"
v-model:isShow="isShow"
v-model="demandForm"
@update-list="handleQuery"
></Edialog>

View File

@ -116,10 +116,11 @@ import {
getCasDemandInfo,
updateCasDemand,
} from "@/api/dataApproval/enterpriseServiceDemand";
import CityOptions from "@/views/components/CityOptions";
import { uniqueId } from "lodash";
// import CityOptions from "@/views/components/CityOptions";
import { ElMessage } from "element-plus";
import { useRoute, useRouter } from "vue-router";
import { demandCategoryList } from "@/utils/parameter";
const router = useRouter();
const route = useRoute();
const data = reactive({
@ -150,24 +151,7 @@ const data = reactive({
const { form, rules } = toRefs(data);
const labelWidth = 140;
const checkList = reactive([
{
id: 1,
name: "成果推广",
},
{
id: 2,
name: "关键成果解决",
},
{
id: 3,
name: "对接专家院士",
},
{
id: 4,
name: "上市辅导",
},
]);
const checkList = reactive(demandCategoryList);
const checkInput = ref("");
const cityFormRef = ref();
const formRef = ref();
@ -203,6 +187,12 @@ function addCheck() {
if (route.query.id) {
getCasDemandInfo(route.query.id).then((resp) => {
form.value = resp.data;
// checkList
for (const item of resp.data.kinds) {
if (!checkList.find((el) => el.name === item)) {
checkList.push({ id: uniqueId("unq-"), name: item });
}
}
});
}
</script>

View File

@ -62,21 +62,21 @@
<el-table :data="dataList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="80"></el-table-column>
<el-table-column label="编号" align="center" prop="id"></el-table-column>
<el-table-column
<!-- <el-table-column
label="需求名称"
align="center"
prop="title"
></el-table-column>
></el-table-column> -->
<el-table-column label="需求类型" align="center">
<template #default="{ row }">
{{ categoryMap[row.category] }}需求
</template>
</el-table-column>
<el-table-column
<!-- <el-table-column
label="所属领域"
align="center"
prop="industryStr"
></el-table-column>
></el-table-column> -->
<el-table-column
label="联系人"
align="center"
@ -97,13 +97,13 @@
align="center"
prop=""
></el-table-column> -->
<el-table-column label="站点" align="center">
<!-- <el-table-column label="站点" align="center">
<template #default="{ row }">
{{
siteList.find((el) => el.id === row.tenantId)?.name ?? "无"
}}</template
>
</el-table-column>
</el-table-column> -->
<el-table-column
label="发布时间"
align="center"

View File

@ -17,9 +17,9 @@
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="所属站点" prop="tenantId">
<!-- <el-form-item label="所属站点" prop="tenantId">
<SiteOptions v-model="queryParams.tenantId" :site-list="siteList" />
</el-form-item>
</el-form-item> -->
<el-form-item>
<el-button
@ -81,11 +81,11 @@
<div>{{ row.industrys[row.industrys.length - 1] }}</div>
</template>
</el-table-column>
<el-table-column label="站点" align="center">
<!-- <el-table-column label="站点" align="center">
<template #default="{ row }">
{{ siteList.find((el) => el.id === row.tenantId)?.name ?? "无" }}
</template>
</el-table-column>
</el-table-column> -->
<el-table-column label="所在地" align="center" prop="address" />
<el-table-column label="企业类型" align="center" prop="kind">
<template #default="{ row }">
@ -317,7 +317,7 @@ import {
} from "@/api/dataList/enterprise";
import md5 from "js-md5";
import { getToken } from "@/utils/auth";
import SiteOptions from "@/views/components/SiteOptions";
// import SiteOptions from "@/views/components/SiteOptions";
// import axios from "axios";
// import { download } from "@/utils/request";
// import dayjs from "dayjs";
@ -360,7 +360,7 @@ const upload = reactive({
const { queryParams } = toRefs(data);
const showSearch = ref(true);
const siteList = ref([]);
// const siteList = ref([]);
const loading = ref(true);
const total = ref(0);
const dataList = ref([]);
@ -374,10 +374,10 @@ const getList = async () => {
loading.value = false;
};
// 获取站点列表
const getSiteList = async () => {
const resp = await tenantSelect();
siteList.value = resp.rows;
};
// const getSiteList = async () => {
// const resp = await tenantSelect();
// siteList.value = resp.rows;
// };
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
@ -624,5 +624,5 @@ const handleExport = () => {
});
};
getList();
getSiteList();
// getSiteList();
</script>

View File

@ -71,8 +71,12 @@ const submitForm = async () => {
const getDetailById = async () => {
if (route.query.id) {
const obj = Object.assign({}, route, { title: "修改专家" });
tab.updatePage(obj);
const { data } = await companyDetail(route.query.id);
form.value = data;
form.value.keywords = data.keyword ? data.keyword.split(",") : [];
console.log(form.value);
form.value.district = data.area;
}
};

View File

@ -11,9 +11,9 @@
/>
</el-form-item>
<el-form-item label="所属站点" prop="tenantId">
<!-- <el-form-item label="所属站点" prop="tenantId">
<SiteOptions v-model="queryParams.tenantId" :site-list="siteList" />
</el-form-item>
</el-form-item> -->
<el-form-item>
<el-button
@ -77,11 +77,11 @@
</el-table-column>
<el-table-column label="学历" align="center" prop="education" />
<!-- <el-table-column label="备注" align="center" prop="introduce" /> -->
<el-table-column label="站点" align="center">
<!-- <el-table-column label="站点" align="center">
<template #default="{ row }">
{{ siteList.find((el) => el.id === row.tenantId)?.name ?? "无" }}
</template>
</el-table-column>
</el-table-column> -->
<el-table-column label="所在地" align="center" prop="address" />
<el-table-column label="操作" align="center">
<template #default="{ row }">
@ -251,7 +251,7 @@ import {
restPassword,
} from "@/api/dataList/expert";
import md5 from "js-md5";
import SiteOptions from "@/views/components/SiteOptions";
// import SiteOptions from "@/views/components/SiteOptions";
import { tenantSelect } from "@/api/subPlatform/tenant";
import { expertList } from "@/api/expert/expert";
import { useRouter } from "vue-router";
@ -262,7 +262,7 @@ import { ElLoading, ElMessageBox, ElMessage } from "element-plus";
import dayjs from "dayjs";
import request from "@/utils/request";
const router = useRouter();
const siteList = ref([]);
// const siteList = ref([]);
const dataList = ref([]);
const total = ref(0);
const showSearch = ref(true);
@ -369,11 +369,11 @@ const submitResetPassword = async () => {
showResetPassword.value = false;
};
// 获取站点列表
const getSiteList = async () => {
const resp = await tenantSelect();
siteList.value = resp.rows;
};
// // 获取站点列表
// const getSiteList = async () => {
// const resp = await tenantSelect();
// siteList.value = resp.rows;
// };
/** 查询专家列表 */
const getList = async () => {
loading.value = true;
@ -505,6 +505,6 @@ const handleExport = () => {
);
});
};
getSiteList();
// getSiteList();
getList();
</script>

View File

@ -0,0 +1,108 @@
<template>
<div class="app-container">
<div style="width: 50%">
<LaboratoryForm
v-model="form"
:showTitle="true"
:formType="formType"
:labelWidth="140"
ref="laboratoryFormRef"
/>
</div>
<el-button @click="cancel">取消</el-button>
<el-button type="primary" @click="submitForm">提交</el-button>
</div>
</template>
<script setup name="LaboratoryAdd">
import LaboratoryForm from "@/views/components/LaboratoryForm";
import tab from "@/plugins/tab";
import {
casLaboratoryAdd,
casLaboratoryDetail,
casLaboratoryUpdate,
} from "@/api/dataList/laboratory";
import { reactive, toRefs } from "vue";
import { useRoute, useRouter } from "vue-router";
import { ElMessage } from "element-plus";
const router = useRouter();
const route = useRoute();
const formType = ref(1);
const laboratoryFormRef = ref(null);
const data = reactive({
form: {
// image: undefined,
// name: undefined,
// tenantId: undefined,
// province: undefined, // 省code
// city: undefined, // 市code
// district: undefined, // 区code
// address: undefined, // 详细地址
// product: undefined,
// kind: undefined,
// code: undefined,
// inviterCode: undefined,
// url: undefined,
// industrys: [],
// keywords: [],
// directions: [],
// introduce: undefined,
// license: undefined,
},
});
const { form } = toRefs(data);
const cancel = () => {
router.back();
tab.closeOpenPage();
};
const submitForm = async () => {
const valid = await laboratoryFormRef.value.validateForm();
if (valid) {
form.value.keyword = form.value.keywords.join(",");
if (form.value.id != undefined) {
await casLaboratoryUpdate(form.value);
cancel();
ElMessage.success("修改成功");
} else {
await casLaboratoryAdd(form.value);
cancel();
ElMessage.success("新增成功");
}
} else {
console.log("校验未通过");
}
};
const getDetailById = async () => {
if (route.query.id) {
const { data } = await casLaboratoryDetail(route.query.id);
form.value = data;
form.value.keywords = data.keyword ? data.keyword.split(",") : [];
// form.value.district = data.area;
}
};
getDetailById();
</script>
<!-- <script>
export default {
components: {
ExpertForm,
},
data() {
return {
// formType: 2,
// labelWidth: 140,
};
},
methods: {},
created() {
const { id } = this.$route.query;
if (id) {
companyDetail({ id }).then((res) => {
form.value = res.data;
});
}
},
};
</script> -->

View File

@ -0,0 +1,531 @@
<template>
<div class="app-container">
<el-form :model="queryParams" :inline="true">
<el-form-item label="姓名" prop="name">
<el-input
v-model="queryParams.name"
placeholder="请输入关键字"
clearable
size="default"
style="width: 240px"
/>
</el-form-item>
<!--
<el-form-item label="所属站点" prop="tenantId">
<SiteOptions v-model="queryParams.tenantId" :site-list="siteList" />
</el-form-item> -->
<el-form-item>
<el-button
type="primary"
icon="search"
size="default"
@click="handleQuery"
>搜索</el-button
>
<el-button icon="refresh" size="default" @click="resetQuery"
>重置</el-button
>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="plus"
size="default"
@click="handleAdd"
>新增</el-button
>
</el-col>
<el-col :span="1.5">
<el-button
type="info"
plain
icon="upload"
size="default"
@click="handleImport"
>导入</el-button
>
</el-col>
<!-- <el-col :span="1.5">
<el-button
type="warning"
plain
icon="download"
size="default"
@click="handleExport"
>导出</el-button
>
</el-col> -->
<right-toolbar
:showSearch.sync="showSearch"
@queryTable="getList"
></right-toolbar>
</el-row>
<!-- 表格区域 -->
<el-table v-loading="loading" :data="dataList">
<el-table-column label="数据编号" align="center" prop="id" />
<el-table-column label="实验室全称" align="center" prop="name" />
<el-table-column label="所属院所或高校" align="center" prop="school" />
<el-table-column label="实验室简介" align="center" show-overflow-tooltip>
<template #default="{ row }">
<div v-html="row.introduction"></div>
</template>
</el-table-column>
<el-table-column
label="核心成员及简介"
align="center"
show-overflow-tooltip
>
<template #default="{ row }">
<div v-html="row.member"></div>
<!-- {{ siteList.find((el) => el.id === row.tenantId)?.name ?? "无" }} -->
</template>
</el-table-column>
<el-table-column
label="研究方向"
align="center"
prop="researchDirection"
show-overflow-tooltip
/>
<el-table-column
label="主要技术应用场景"
align="center"
prop="primaryTechnology"
/>
<el-table-column label="所属行业领域" align="center" prop="industryStr" />
<el-table-column label="联系电话" align="center" prop="phone" />
<el-table-column label="网址" align="center" prop="url" />
<!-- <el-table-column label="关键词" align="center" prop="address" /> -->
<el-table-column label="操作" align="center">
<template #default="{ row }">
<el-button
size="small"
type="text"
icon="edit"
@click="handleDetail(row.id)"
>修改</el-button
>
<el-button
size="small"
type="text"
icon="edit"
@click="handleDelete(row.id)"
>删除</el-button
>
<!-- <el-button
size="small"
type="text"
icon="plus"
@click="handleClaim(row.id)"
>已认领专利</el-button
>
<el-button
size="small"
type="text"
icon="edit"
@click="openAssignAccount(row.id)"
>分配账号</el-button
>
<el-button
size="small"
type="text"
icon="edit"
@click="openResetPassword(row.id)"
>重置密码</el-button
> -->
</template>
</el-table-column>
</el-table>
<!-- 分页器 -->
<pagination
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
<!-- 用户导入对话框 -->
<el-dialog
:title="upload.title"
v-model="upload.open"
width="400px"
append-to-body
>
<el-upload
ref="uploadRef"
:limit="1"
accept=".xlsx, .xls"
:headers="upload.headers"
:action="upload.url"
:disabled="upload.isUploading"
:on-progress="handleFileUploadProgress"
:on-success="handleFileSuccess"
:auto-upload="false"
drag
>
<el-icon class="el-icon--upload"><upload-filled /></el-icon>
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
<template #tip>
<div class="el-upload__tip text-center">
<!-- <div class="el-upload__tip">
<el-checkbox
v-model="upload.updateSupport"
/>是否更新已经存在的用户数据
</div> -->
<span>仅允许导入xlsxlsx格式文件</span>
<!-- <el-link
type="primary"
:underline="false"
style="font-size: 12px; vertical-align: baseline"
@click="importTemplate"
>下载模板</el-link
> -->
</div>
</template>
</el-upload>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitFileForm"> </el-button>
<el-button @click="upload.open = false"> </el-button>
</div>
</template>
</el-dialog>
<!-- <el-dialog
title="分配账号"
v-model="showAssignAccount"
width="400px"
append-to-body
>
<el-form
:model="assignAccountForm"
:rules="assignAccoutRules"
label-width="80px"
ref="assignAccountFormRef"
>
<el-form-item label="用户名" prop="username">
<el-input v-model="assignAccountForm.username"></el-input>
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input
v-model="assignAccountForm.password"
show-password
></el-input>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitAssignAccount"
> </el-button
>
<el-button @click="closeAssignAccount"> </el-button>
</div>
</template>
</el-dialog>
<el-dialog
title="重置密码"
v-model="showResetPassword"
width="400px"
append-to-body
>
<el-form
:model="resetPasswordForm"
:rules="assignAccoutRules"
label-width="80px"
ref="resetPasswordFormRef"
>
<el-form-item label="密码" prop="password">
<el-input
v-model="resetPasswordForm.password"
show-password
></el-input>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitResetPassword"
> </el-button
>
<el-button @click="closeResetPassword"> </el-button>
</div>
</template>
</el-dialog> -->
</div>
</template>
<script setup>
// import {
// expertDelete,
// allocateAccount,
// getAccount,
// restPassword,
// } from "@/api/dataList/expert";
// import md5 from "js-md5";
// import SiteOptions from "@/views/components/SiteOptions";
import { tenantSelect } from "@/api/subPlatform/tenant";
// import { expertList } from "@/api/expert/expert";
import { useRouter } from "vue-router";
import { getToken } from "@/utils/auth";
import { tansParams, blobValidate } from "@/utils/ruoyi";
import {
casLaboratoryList,
casLaboratoryDelete,
} from "@/api/dataList/laboratory";
import FieldOptions from "@/views/components/FieldOptions";
import { ElLoading, ElMessageBox, ElMessage } from "element-plus";
import dayjs from "dayjs";
import request from "@/utils/request";
const router = useRouter();
const siteList = ref([]);
const dataList = ref([]);
const total = ref(0);
const showSearch = ref(true);
const data = reactive({
queryParams: {
pageNum: 1,
pageSize: 10,
},
});
const loading = ref(true);
/*** 用户导入参数 */
const upload = reactive({
// 是否显示弹出层(用户导入)
open: false,
// 弹出层标题(用户导入)
title: "",
// 是否禁用上传
isUploading: false,
// 是否更新已经存在的用户数据
// updateSupport: 0,
// 设置上传的请求头部
headers: { Authorization: "Bearer " + getToken() },
// 上传的地址
url: import.meta.env.VITE_APP_BASE_API + "/business/casLaboratory/importData",
});
const { queryParams } = toRefs(data);
// const assignAccoutRules = {
// username: [{ required: true, message: "请输入用户名", trigger: "blur" }],
// password: [{ required: true, message: "请输入密码", trigger: "blur" }],
// vipType: [{ required: true, message: "请选择会员类型", trigger: "change" }],
// expireTime: [
// { required: true, message: "请选择到期时间", trigger: "change" },
// ],
// };
// const showAssignAccount = ref(false);
// const assignAccountForm = reactive({
// username: undefined,
// password: undefined,
// });
// const assignAccountFormRef = ref();
// const resetPasswordForm = reactive({
// password: undefined,
// });
// const resetPasswordFormRef = ref();
// const showResetPassword = ref(false);
// const openAssignAccount = async (id) => {
// resetForm();
// const { have, data } = await getAccount(id);
// if (have) {
// ElMessageBox.alert(`已经存在账号:${data}`, "账号已经存在");
// } else {
// assignAccountForm.id = id;
// showAssignAccount.value = true;
// }
// };
// const openResetPassword = async (id) => {
// resetForm();
// const { have } = await getAccount(id);
// if (have) {
// resetPasswordForm.id = id;
// showResetPassword.value = true;
// } else {
// ElMessageBox.alert(`尚未分配账号,请先分配账号`, "尚未分配账号");
// }
// };
// const resetForm = () => {
// if (resetPasswordFormRef.value) {
// resetPasswordFormRef.value.resetFields();
// }
// if (assignAccountFormRef.value) {
// assignAccountFormRef.value.resetFields();
// }
// resetPasswordForm.password = undefined;
// assignAccountForm.username = undefined;
// assignAccountForm.password = undefined;
// };
// const closeResetPassword = () => {
// resetForm();
// showResetPassword.value = false;
// };
// const closeAssignAccount = () => {
// resetForm();
// showAssignAccount.value = false;
// };
// const submitAssignAccount = async () => {
// await assignAccountFormRef.value.validate();
// await allocateAccount({
// ...assignAccountForm,
// password: md5(assignAccountForm.password),
// });
// ElMessage.success("账号分配成功");
// showAssignAccount.value = false;
// };
// const submitResetPassword = async () => {
// await resetPasswordFormRef.value.validate();
// await restPassword(resetPasswordForm.id, md5(resetPasswordForm.password));
// ElMessage.success("密码重置成功");
// showResetPassword.value = false;
// };
// 获取站点列表
const getSiteList = async () => {
const resp = await tenantSelect();
siteList.value = resp.rows;
};
/** 查询专家列表 */
const getList = async () => {
loading.value = true;
const resp = await casLaboratoryList(queryParams.value);
dataList.value = resp.rows;
total.value = resp.total;
loading.value = false;
};
// 新增页面跳转
const handleAdd = () => {
router.push({
path: "/dataList/laboratory/add",
});
};
// 修改页面 获取详情
const handleDetail = (id) => {
router.push({
path: "/dataList/laboratory/add",
query: { id },
});
};
// 认领专利
// const handleClaim = (id) => {
// router.push({
// path: "/dataList/expert/claim",
// query: { id },
// });
// };
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
};
/** 重置按钮操作 */
const resetQuery = () => {
queryParams.value.name = "";
queryParams.value.tenantId = "";
handleQuery();
};
const uploadRef = ref(null);
/** 导入按钮操作 */
function handleImport() {
upload.title = "用户导入";
upload.open = true;
}
/** 下载模板操作 */
function importTemplate() {
proxy.download(
"system/user/importTemplate",
{},
`user_template_${new Date().getTime()}.xlsx`
);
}
/**文件上传中处理 */
const handleFileUploadProgress = (event, file, fileList) => {
upload.isUploading = true;
};
/** 文件上传成功处理 */
const handleFileSuccess = (response, file, fileList) => {
upload.open = false;
upload.isUploading = false;
uploadRef.value.handleRemove(file);
ElMessageBox.alert(
"<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" +
response.msg +
"</div>",
"导入结果",
{ dangerouslyUseHTMLString: true }
);
getList();
};
/** 提交上传文件 */
function submitFileForm() {
uploadRef.value.submit();
}
const handleDelete = async (id) => {
ElMessageBox.confirm(`是否确认删除编号为${id}的数据项?`)
.then(async () => {
await casLaboratoryDelete(id);
getList();
ElMessage.success("删除成功");
})
.catch(() => {});
};
let downloadLoadingInstance;
const download = (url, filename) => {
downloadLoadingInstance = ElLoading.service({
text: "正在下载数据,请稍候",
background: "rgba(0, 0, 0, 0.7)",
});
return request
.get(url, {
// transformRequest: [
// (params) => {
// return tansParams(params);
// },
// ],
headers: { "Content-Type": "application/x-www-form-urlencoded" },
responseType: "blob",
})
.then(async (data) => {
const isLogin = await blobValidate(data);
if (isLogin) {
const blob = new Blob([data]);
saveAs(blob, filename);
} else {
const resText = await data.text();
const rspObj = JSON.parse(resText);
const errMsg =
errorCode[rspObj.code] || rspObj.msg || errorCode["default"];
ElMessage.error(errMsg);
}
downloadLoadingInstance.close();
})
.catch((r) => {
console.error(r);
ElMessage.error("下载文件出现错误,请联系管理员!");
downloadLoadingInstance.close();
});
};
// const handleExport = () => {
// ElMessageBox.confirm(`是否确认企业列表?`).then(() => {
// download(
// `/business/enterprise/export`,
// `企业信息(${dayjs().format("YYYYMMDDHHmmss")}).xlsx`
// );
// });
// };
getSiteList();
getList();
</script>

View File

@ -32,9 +32,9 @@
<el-table-column prop="title" label="论文题目" align="center" />
<el-table-column prop="ext" label="期刊名称" align="center" />
<el-table-column prop="author" label="作者" align="center" />
<el-table-column prop="tags" label="关键词" align="center">
<el-table-column label="关键词" align="center">
<template #default="{ row }">
{{ row.tags }}
{{ row.keyword }}
</template>
</el-table-column>
<el-table-column prop="publishTime" label="出版日期" align="center" />
@ -95,7 +95,7 @@
:labelWidth="100"
v-model="formData"
title="标签"
fieldKey="tagsList"
fieldKey="keywords"
/>
<!-- <el-form-item label="标签">
<template #default="{ row }">
@ -126,6 +126,13 @@
placeholder="请输入摘要"
/>
</el-form-item>
<el-form-item label="上传论文:" prop="fileUrl">
<FileUpload
v-model="formData.fileUrl"
:limit="1"
:fileType="['docx', 'doc', 'pdf']"
></FileUpload>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button type="" @click="close">取消</el-button>
@ -169,7 +176,7 @@ const dataList = ref([]);
const total = ref(0);
const isShow = ref(false);
const { queryData } = toRefs(data);
const tags = ref([]);
// const tags = ref([]);
// 获取论文列表
const getList = async () => {
const res = await expertList(queryData.value);
@ -202,22 +209,22 @@ const delList = async (id) => {
};
// 新增功能
const btnAdd = () => {
formData.value.tagsList = [];
formData.value.keywords = [];
isShow.value = true;
};
// 确认添加标签
const addTag = () => {
if (!formData.value.tags) return;
tags.value.push(formData.value.tags);
formData.value.tags = "";
};
// const addTag = () => {
// if (!formData.value.tags) return;
// tags.value.push(formData.value.tags);
// formData.value.tags = "";
// };
// 删除标签
const handleClose = (val) => {
tags.value.splice(tags.value.indexOf(val), 1);
};
// const handleClose = (val) => {
// tags.value.splice(tags.value.indexOf(val), 1);
// };
// 添加/编辑
const btnReadd = async () => {
formData.value.tags = formData.value.tagsList.join(",");
formData.value.tags = formData.value.keyword.join(",");
await addItem(formData.value);
ElMessage.success("添加成功");
getList();
@ -225,7 +232,7 @@ const btnReadd = async () => {
};
// 修改
const btnPut = async () => {
formData.value.tags = formData.value.tagsList.join(",");
formData.value.keyword = formData.value.keywords.join(",");
await rebtnItem(formData.value);
ElMessage.success("修改成功");
getList();
@ -235,11 +242,11 @@ const btnPut = async () => {
const editBtn = async (id) => {
const resp = await editItem(id);
formData.value = resp.data;
formData.value.tagsList = formData.value.tags
? formData.value.tags.split(",")
formData.value.keywords = formData.value.keyword
? formData.value.keyword.split(",")
: [];
tags.value = formData.value.tags && formData.value.tags.split(",");
formData.value.tags = "";
// tags.value = formData.value.tags && formData.value.tags.split(",");
// formData.value.tags = "";
isShow.value = true;
};
// 弹框关闭时间

View File

@ -79,6 +79,7 @@ const getDetailById = async () => {
if (route.query.id) {
const { data } = await companyDetail(route.query.id);
form.value = data;
form.value.keywords = data.keyword ? data.keyword.split(",") : [];
form.value.district = data.area;
}
};

View File

@ -20,13 +20,13 @@
<el-option label="已拒绝" :value="2" />
</el-select>
</el-form-item>
<el-form-item label="站点">
<!-- <el-form-item label="站点">
<SiteOptions
v-model="queryData.tenantId"
:site-list="siteList"
style="width: 160px"
/>
</el-form-item>
</el-form-item> -->
<el-form-item style="float: right">
<el-button
@ -59,11 +59,11 @@
/>
<el-table-column prop="school" label="毕业院校" align="center" />
<el-table-column prop="post" label="职务" align="center" />
<el-table-column label="站点" align="center">
<!-- <el-table-column label="站点" align="center">
<template #default="{ row }">
{{ siteList.find((el) => el.id === row.tenantId)?.name ?? "无" }}
</template>
</el-table-column>
</el-table-column> -->
<el-table-column prop="address" label="所在地" align="center" />
<el-table-column prop="examineStatus" label="审核状态" align="center">
<template #default="{ row }">
@ -106,7 +106,7 @@ const data = reactive({
});
const total = ref(0);
const dataList = ref([]);
const siteList = ref([]);
// const siteList = ref([]);
const { queryData } = toRefs(data);
const examineStatusDict = {
0: "审核中",
@ -120,10 +120,10 @@ const getList = async () => {
total.value = res.total;
};
// 获取站点列表
const getSiteList = async () => {
const resp = await tenantSelect();
siteList.value = resp.rows;
};
// const getSiteList = async () => {
// const resp = await tenantSelect();
// siteList.value = resp.rows;
// };
// 搜索查询
const handleQuery = () => {
getList(queryData.value);
@ -145,6 +145,6 @@ const btnAudit = (id) => {
});
};
getList();
getSiteList();
// getSiteList();
</script>
<style></style>

View File

@ -0,0 +1,301 @@
<template>
<el-form
ref="formRef"
:model="modelValue"
:rules="rules"
:label-width="labelWidth + 'px'"
:disabled="disabled"
>
<el-row>
<el-col :span="24">
<el-form-item label="所属领域:" prop="industrys" :show-message="false">
<el-row type="flex" justify="space-between">
<el-col :span="6">
<el-form-item>
<el-select
v-model="fields[0]"
value-key="id"
placeholder="请选择"
@change="levelIChange"
>
<el-option
v-for="item in levelI"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-select
v-model="fields[1]"
value-key="id"
placeholder="请选择"
:disabled="levelII.length === 0"
@change="levelIIChange"
>
<el-option
v-for="item in levelII"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-col>
<el-col :span="6">
<el-select
v-model="fields[2]"
value-key="id"
:disabled="levelIII.length === 0"
placeholder="请选择"
>
<el-option
v-for="item in levelIII"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-col>
<el-col :span="3">
<el-button type="primary" @click="fieldAdd">添加</el-button>
<!-- <el-button type="primary" @click="check">验证</el-button> -->
</el-col>
</el-row>
<div class="e_tag">
<el-tag
v-for="(tag, index) in industrysTags"
:key="index"
closable
@close="handleFieldClose(index)"
>
{{ tag }}
<!-- <template v-if="Array.isArray(tag)">
<span v-for="(item, i) in tag" :key="item">
{{ item.name }}
<span v-if="tag.length != i + 1">></span>
</span>
</template>
<template v-else>
<span>{{ tag }}</span>
</template> -->
</el-tag>
</div>
</el-form-item>
</el-col>
</el-row>
</el-form>
</template>
<script setup name="FieldOptions">
// import { industry } from "@/api/config";
import { listSysIndustry } from "@/api/platform/industry";
import { ElMessage } from "element-plus";
import { toRefs, watch, reactive } from "vue";
const props = defineProps({
modelValue: Object,
labelWidth: {
type: Number,
default: 120,
},
disabled: {
type: Boolean,
default: false,
},
});
const { modelValue, labelWidth, disabled } = toRefs(props);
const formRef = ref(null);
const levelI = ref([]); // I级数据
const levelII = ref([]); // II级数据
const levelIII = ref([]); // III级数据
const fields = ref([]); // 当前下拉框选中的集合
const industrysTags = ref([]); // 点击添加按钮后临时存储的数据集合
const data = reactive({
rules: {
industrys: [
{
type: "array",
required: true,
message: "请选择并添加",
trigger: "change",
},
],
},
});
const { rules } = toRefs(data);
// 获取领域树形列表
const getIndustryTreeData = async () => {
const { data } = await listSysIndustry();
levelI.value = data;
};
const levelIChange = async (item) => {
delete fields.value[1];
delete fields.value[2];
levelII.value = levelI.value.find((el) => {
return el.id === item;
}).children;
};
const levelIIChange = async (item) => {
delete fields.value[2];
levelIII.value = levelII.value.find((el) => el.id === item).children;
};
// 根据id获取领域名称
// TODO:如果领域已经被删除,则显示未知领域
const getFieldNameById = (ids) => {
if (levelI.value.length === 0) {
return;
}
let fieldNameList = [];
let subFieldList = [];
for (let i = 0; i < ids.length; i++) {
const id = ids[i];
if (fieldNameList.length === 0) {
subFieldList = levelI.value.find((el) => el.id == id)?.children;
fieldNameList.push(levelI.value.find((el) => id === el.id)?.name);
} else {
fieldNameList.push(subFieldList.find((el) => id === el.id)?.name);
subFieldList = subFieldList.find((el) => el.id == id)?.children;
}
}
return fieldNameList.join(">");
};
// 所属领域添加按钮
const fieldAdd = () => {
if (!fields.value.length) return ElMessage.error("请选择领域类型");
// 移除校验
formRef.value.clearValidate();
industrysTags.value.push(fields.value);
modelValue.value.industrys.push(fields.value.join("-"));
fields.value = [];
levelII.value = [];
levelIII.value = [];
// for (let i = 0; i < industrysTags.value.length; i++) {
// modelValue.value.industrys.push("");
// const item = industrysTags.value[i];
// for (let j = 0; j < item.length; j++) {
// const item2 = item[j];
// if (modelValue.value.industrys[i] == "") {
// modelValue.value.industrys[i] = item2.id;
// } else {
// modelValue.value.industrys[i] =
// modelValue.value.industrys[i] + "-" + item2.id;
// }
// }
// }
// fields.value = [];
// levelII.value = [];
// levelIII.value = [];
};
const handleFieldClose = (index) => {
industrysTags.value.splice(index, 1);
modelValue.value.industrys.splice(index, 1);
formRef.value.validate();
};
const validateForm = async () => {
try {
return await formRef.value.validate();
} catch (error) {
return false;
}
};
getIndustryTreeData();
watch(
modelValue,
(newVal) => {
modelValue.value.industrys = [];
// console.log(modelValue.value.industry ? 1 : 0);
let industrysList = modelValue.value.industryName
? modelValue.value.industryName.split(",")
: [];
modelValue.value.industrys.push(...industrysList);
for (const field of industrysList) {
industrysTags.value.push(field);
}
// let _key = [];
// let _value = [];
// for (let i = 0; i < newVal.industrys.length; i++) {
// const item = newVal.industrys[i];
// _key.push(item.key);
// _value.push(item.value);
// }
// newVal.industrys = _key;
// let keyObj = [];
// for (let i = 0; i < _key.length; i++) {
// keyObj.push([]);
// let array = _key[i].split("-");
// for (let j = 0; j < array.length; j++) {
// keyObj[i].push({
// id: array[j],
// });
// }
// }
// for (let i = 0; i < _value.length; i++) {
// let array = _value[i].split(">");
// for (let j = 0; j < array.length; j++) {
// keyObj[i][j]["name"] = array[j];
// }
// }
// industrysTags.value = keyObj;
},
{ immediate: true }
);
defineExpose({
validateForm,
});
</script>
<!-- <script>
export default {
watch: {
value(newVal, oldVal) {
let _key = [];
let _value = [];
for (let i = 0; i < newVal.industrys.length; i++) {
const item = newVal.industrys[i];
_key.push(item.key);
_value.push(item.value);
}
newVal.industrys = _key;
let keyObj = [];
for (let i = 0; i < _key.length; i++) {
keyObj.push([]);
let array = _key[i].split("-");
for (let j = 0; j < array.length; j++) {
keyObj[i].push({
id: array[j],
});
}
}
for (let i = 0; i < _value.length; i++) {
let array = _value[i].split(">");
for (let j = 0; j < array.length; j++) {
keyObj[i][j]["name"] = array[j];
}
}
industrysTags.value = keyObj;
},
},
};
</script> -->
<style lang="scss" scoped>
.e_tag {
.el-tag {
margin-right: 10px;
}
}
</style>

View File

@ -404,13 +404,14 @@ import {
cityList,
districtList,
} from "@/api/config";
import FieldOptions from "@/views/components/FieldOptions";
import FieldOptions from "./FieldOptions";
// import { cloneDeep } from "lodash";
import { reactive, toRefs } from "vue";
// import { constants } from "buffer";
import { ElMessage, ElMessageBox } from "element-plus";
import WangEditor from "@/components/WangEditor/index.vue";
import SiteOptions from "@/views/components/SiteOptions";
import { useRouter } from "vue-router";
const router = useRouter();
const dataList = ref([]);
const loading = ref(true);
@ -449,7 +450,7 @@ const data = reactive({
pageSize: 10,
},
form: {
industrys: [],
// industrys: [],
},
rules: {
title: [{ required: true, message: "活动名称不能为空", trigger: "blur" }],
@ -546,7 +547,7 @@ const reset = () => {
id: undefined,
tenantId: undefined,
title: undefined,
industrys: [],
// industrys: [],
// notifyCrowd: [],
maxNumber: 0,
isHome: 1,
@ -636,8 +637,12 @@ const handleUpdate = async (row) => {
const resp = await activityDetail(row.id);
const formData = resp.data;
formData.notifyCrowds = formData.notifyCrowd?.split(",") ?? [];
formData.industrys = formData.industryName?.split(",") ?? [];
// formData.industrys = formData.industryName?.split(",") ?? [];
// formData.industrys = ["eqwe", "eqwe"];
// console.log(formData);
form.value = formData;
// form.value.industrys = ["rnm", "fdf"];
// console.log(form.value);
showEditDialog.value = true;
title.value = "修改";
};

View File

@ -31,7 +31,7 @@ export default defineConfig(({ mode, command }) => {
proxy: {
// https://cn.vitejs.dev/config/#server-proxy
"/dev-api": {
// target: 'http://192.168.110.10:1618',
// target: "http://192.168.110.10:1618",
target: "http://101.34.131.16:1618",
changeOrigin: true,
rewrite: (p) => p.replace(/^\/dev-api/, ""),