export const levelMap = {
1:"全平台投放",
2:"首页投放",
3:"区域投放",
4:"内部投放",
}<template>
<div style="padding: 15px; width: 800px;" >
<p>复杂的增删改查,可以查看修改记录</p>
<div><el-button @click="add">新建</el-button></div>
<el-table :data="list">
<el-table-column label="项目名" prop="name">
</el-table-column>
<el-table-column label="级别">
<template #default="scope">
<div>{{ levelMap[scope.row.level] }}</div>
</template>
</el-table-column>
<el-table-column label="是否第三方">
<template #default="scope">
<div>{{scope.row.other==1?"是":"否"}}</div>
</template>
</el-table-column>
<el-table-column label="目标人群">
<template #default="scope">
<div>{{formatPeople(scope.row.peopleList)}}</div>
</template>
</el-table-column>
<el-table-column label="操作">
<template #default="scope">
<el-button size="small" type="primary" @click="clickView(scope.row.id)" >详情</el-button>
<el-button size="small" type="success" @click="clickEdit(scope.row.id)">编辑</el-button>
<el-popconfirm title="您确定要删除这条记录吗?" @confirm="clickDelete(scope.row.id)">
<template #reference>
<el-button size="small" type="danger" >删除</el-button>
</template>
</el-popconfirm>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script setup>
import requestUtil from "@/util/request";
import store from '@/store'
import {ref, computed , onMounted,nextTick , reactive,onBeforeMount, onBeforeUpdate, onUpdated, onBeforeUnmount, onUnmounted} from 'vue'
import {ElMessage} from 'element-plus'
import router from '@/router'
import Cookies from "js-cookie";
import { encrypt, decrypt } from "@/util/jsencrypt";
import {Check, Delete, Edit, Message, Search, Star,} from '@element-plus/icons-vue'
import {levelMap} from "@/util/constant";
const list = ref([]);
function formatPeople(people){
const arr = people.map((item)=>{
return item.name
})
return arr.join(",");
}
const queryForm=ref({
query:'',
pageNum:1,
pageSize:100
})
const initList =async()=>{
console.log(queryForm.value);
const res=await requestUtil.post("api/project/list",queryForm.value);
list.value=res.data.projectList;
}
initList();
function add(){
router.push("/test/demo1/detail?type=create");
}
function clickView(id){
router.push("/test/demo1/detail?type=view&id="+id);
}
function clickEdit(id){
router.push("/test/demo1/detail?type=edit&id="+id);
}
const clickDelete=async (id)=>{
var ids = []
ids.push(id)
const res=await requestUtil.post("api/project/delete",ids)
if(res.data.code==200){
ElMessage({
type: 'success',
message: '执行成功!'
})
initList();
}else{
ElMessage({
type: 'error',
message: res.data.msg,
})
}
}
</script>
<style scoped>
h2{
font-size: 30px;
padding: 10px 0px;
font-weight: bold;
}
</style>
<script setup>
import requestUtil from "@/util/request";
import store from '@/store'
import {ref, computed , onMounted,nextTick , reactive,onBeforeMount, onBeforeUpdate, onUpdated, onBeforeUnmount, onUnmounted} from 'vue'
import {ElMessage} from 'element-plus'
import router from '@/router'
import Cookies from "js-cookie";
import { encrypt, decrypt } from "@/util/jsencrypt";
import {Check, Delete, Edit, Message, Search, Star,} from '@element-plus/icons-vue'
import {levelMap} from "@/util/constant";
import {useRoute} from 'vue-router'
import detailCom from './detailCom'
const {query} = useRoute();
const type = query.type;
const id = query.id;
//这个暂时 手工设置 。随后 可以后台获取 。
const oldInfoData = ref({
id:-1,
name:"old-name-123",
level:1,
other:1,
peopleList:[
{ "id": 11, "name": "1111211", "size": "1", "touDate": "2024-12-30", "projectId": 10 },
{ "id": 11, "name": "23", "size": "1", "touDate": "2024-12-01", "projectId": 10 },
]
});
const num1 = ref(1);
const num2 = ref(22);
const numsum = computed(() => {
return num1.value + num2.value ;//不相等 返回true isDiff是true 有差异 这是针对字符串的判断
});
function fun1(){
num1.value = 34;
num2.value = 34;
}
const formRef=ref(null)
const form=ref({
id:-1,
name:"",
level:1,
other:1,
peopleList:[
]
})
const rules=ref({
reason:[
{ required: true, message: '请填写原因分析'}
]
})
const isDataLoaded = ref(false);
const init = async()=>{
if(type==='create'){
//isDataLoaded.value = true; //
}else{
//请求数据
const res=await requestUtil.get("api/project/"+id);
form.value=res.data.project;
isDataLoaded.value = true; // 数据加载完成后设置状态
}
}
init();
function add_row(){
form.value.peopleList.push({
name:"",
touDate:"",
size:""
});
}
const save = async()=> {
if(type==='create'){
let result=await requestUtil.post("api/project/save",form.value);
let data=result.data;
if(data.code==200){
ElMessage.success("执行成功!")
}else{
ElMessage.error(data.msg);
}
}else if(type==='edit'){
let result=await requestUtil.post("api/project/edit",form.value);
let data=result.data;
if(data.code==200){
ElMessage.success("执行成功!")
}else{
ElMessage.error(data.msg);
}
}
}
</script>
<style scoped>
h2{
font-size: 20px;
padding: 10px 0px;
font-weight: bold;
}
</style>
<template>
<div style="padding: 15px; width: 450px;">
<el-form
label-width="auto"
ref="formRef"
:model="form"
:rules="rules"
style=" border-radius: 8px; padding-top: 15px;"
>
<el-form-item label="项目名称" prop="name" >
<detailCom :type="type" :nowValue="form.name" :oldValue="oldInfoData.name" >
<el-input v-model="form.name" />
</detailCom>
</el-form-item>
<el-form-item label="项目级别" prop="level" >
<detailCom :type="type" :nowValue="levelMap[form.level]" :oldValue="levelMap[oldInfoData.level]">
<el-select filterable v-model="form.level" placeholder="请选择项目级别" >
<template v-for="item in Object.keys(levelMap)" :key="item">
<el-option :label="levelMap[item]" :value="parseInt(item)"></el-option>
</template>
</el-select>
</detailCom>
</el-form-item>
<el-form-item label="是否有第三方" prop="other" >
<detailCom :type="type" :nowValue="form.other===1?'是':'否'" :oldValue="oldInfoData.other===1?'是':'否'" >
<el-radio-group v-model="form.other">
<el-radio :value="1">是</el-radio>
<el-radio :value="2">否</el-radio>
</el-radio-group>
</detailCom>
</el-form-item>
<h2>人群</h2>
<el-table :data="form.peopleList">
<el-table-column width="150" label="人群名称">
<template #default="scope">
<detailCom :type="type" :nowValue="scope.row.name" :oldValue="oldInfoData.peopleList[scope.$index]?.name" >
<el-input v-model="scope.row.name" />
</detailCom>
</template>
</el-table-column>
<el-table-column width="90" label="投放量级">
<template #default="scope">
<detailCom :type="type" :nowValue="scope.row.size" :oldValue="oldInfoData.peopleList[scope.$index]?.size" >
<el-input v-model="scope.row.size" />
</detailCom>
</template>
</el-table-column>
<el-table-column label="投放时间">
<template #default="scope">
<detailCom :type="type" :nowValue="scope.row.touDate" :oldValue="oldInfoData.peopleList[scope.$index]?.touDate" >
<el-date-picker
v-model="scope.row.touDate"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择日期时间" />
</detailCom>
</template>
</el-table-column>
</el-table>
<div style="text-align: center;">
<el-button @click="add_row">
添加一行
</el-button>
</div>
<el-form-item style="padding-top: 45px;">
<el-button type="primary" @click="save">
提交
</el-button>
</el-form-item>
</el-form>
</div>
</template><script setup>
import {ref, reactive, computed } from 'vue';
const props=defineProps(
{
type:{
required:true
},
nowValue:{
required:true
},
oldValue:{
required:true
},
index:{
required:true
}
}
)
const isDiff = computed(() => {
console.log("计算属性", "nowValue:"+props.nowValue,"oldValue:"+props.oldValue);
console.log("index:", props.index);
if(props.oldValue === undefined || props.oldValue ==='' ){
//如果是undefined就是没有修改。 或者是空字符串。
return false;
}
if(props.nowValue instanceof Array && props.oldValue instanceof Array ){
return props.nowValue.length !== props.oldValue.length;//不相等 返回true isDiff是true 有差异 这是针对字符串的判断
}
return props.nowValue !== props.oldValue ;//不相等 返回true isDiff是true 有差异 这是针对字符串的判断
});
</script>
<style scoped>
.diffColor{
background-color: red;
}
</style>
<template>
<slot v-if="type==='create'||type==='edit'"></slot>
<!-- 这里写name=view 就是让他不是默认插槽 如果不写name=view 下面的el-tooltip-div不会显示的, 会显示传来的html 覆盖下面的el-tooltip-div
<detailCom :type="type" :nowValue="form.name" :oldValue="oldInfoData.name" >
<el-input v-model="form.name" />
</detailCom>
会显示传来的input
name=view 下面的内容相当于是默认值。
-->
<slot v-if="type==='view'" name="view" :value="{nowValue,oldValue}">
<el-tooltip :disabled="!isDiff" :content="`修改前:${oldValue}`">
<div :class="{diffColor:isDiff}">{{nowValue}}</div>
</el-tooltip>
</slot>
</template>主要就是slot 插槽。
站长微信:xiaomao0055
站长QQ:14496453