uniapp地图兼容小程序和APP(高德地图),点击marker并弹框详情

1.uniapp地图页面兼容小程序和APP
2.小程序使用map组件APP使用高德地图
3.点击定位按钮地图自动移动到定位点
4.APP地图逻辑是视图层交互使用renderjs

5.点击地图marker弹框详情
6.全部代码

<template>
	<page-meta :page-style="'overflow:'+(show?'hidden':'visible')"></page-meta>
	<view style="position: relative;">
		<!-- 搜索框 -->
		<view>
			<tui-searchbar @search="handelSearch" @clear="handelCancel"></tui-searchbar>
		</view>
		<!-- 定位图标 -->
		<view class="location" @click="getLocation">
			<tui-icon name="position" color="#ffffff" size="25"></tui-icon>
		</view>
		<!-- 弹出层 -->
		<uv-popup ref="popRef" mode="bottom" bg-color="null" :round="true" z-index="99" @maskClick="cancel">
			<view class="bottom-popup">
				<view class="bottom-title">
					<view>{{state.mapDetail.deviceName}}</view>
					<view @click="cancel">
						<tui-icon name="shut" color="#ffffff" size="30"></tui-icon>
					</view>
				</view>
				<view class="bottom-content">
					<view class="bottom-item">
						<view >
							<!-- <uv-icon name="photo" size="20"></uv-icon> -->
						</view>
						<view>上报时间</view>
						<view>{{state.mapDetail.lastReportTime}}</view>
						<view class="btns" @click="openRepairPage()">
							详情
						</view>
					</view>
					<view class="bottom-item">
						<view>
							<!-- <uv-icon name="photo" size="20"></uv-icon> -->
						</view>
						<view>设备状态</view>
						<view>{{state.mapDetail.online ?'在线':'离线'}}</view>
					</view>
					<view class="bottom-item">
						<view>
							<!-- <uv-icon name="photo" size="20"></uv-icon> -->
						</view>
						<view>电池电压</view>
						<view>{{state.mapDetail.charge || 0}}V</view>
					</view>
					<!-- 					<view class="bottom-item">
						<view>
							<uv-icon name="photo" size="20"></uv-icon>
						</view>
						<view>开阀状态</view>
						<view>{{state.mapDetail.controlSwitchState?'开':'关'}}</view>
					</view> -->
					<view class="bottom-item">
						<view>
							<!-- <uv-icon name="photo" size="20"></uv-icon> -->
						</view>
						<view>是否积水</view>
						<view>{{state.mapDetail.pond == 'T' ?'积水':'未积水'}}</view>
					</view>
					<view class="bottom-item">
						<view>
							<!-- <uv-icon name="photo" size="20"></uv-icon> -->
						</view>
						<view>是否倾倒</view>
						<view>{{state.mapDetail.tpOv == 'T' ?'倾倒':'未倾倒'}}</view>
					</view>
					<view class="bottom-item">
						<view>
							<!-- <uv-icon name="photo" size="20"></uv-icon> -->
						</view>
						<view>倾倒角度</view>
						<view>{{state.mapDetail.angle || 0}}°</view>
					</view>
					<view class="bottom-item">
						<view>
							<!-- <uv-icon name="photo" size="20"></uv-icon> -->
						</view>
						<view>水压</view>
						<view>{{state.mapDetail.waterPressure || 0}}MPa</view>
						<view class="btns" @click="chooseLocations">
							导航
						</view>
					</view>
				</view>
			</view>
		</uv-popup>
		<!-- #ifdef MP-WEIXIN -->
		<map id="map" :latitude="state.latitude" :longitude="state.longitude" :markers="state.markers"
			:style="{ width: '100%', height: windowHeight + 'px' }" :scale="7" @markertap="markTap"></map>
		<!-- #endif -->
		<!-- #ifdef APP-PLUS -->
		<view id="amap" :markerList="markerList" :change:markerList="amap.updateEcharts" :latlon="state.latlon"
			:change:latlon="amap.getLatlon" :style="{ width: '100%', height: windowHeight + 'px' }">
		</view>
		<!-- #endif -->
		<!-- 错误提示 -->
		<uv-toast ref="toast"></uv-toast>
	</view>
</template>
<script>
	import {
		nextTick,
		reactive,
		ref,
		getCurrentInstance
	} from "vue"
	import {
		userLoginUnreadMessagePage
	} from '@/api/sys/userCenterApi'
	import {
		getMapList,
		getFilterList,
		getBoltDetail
	} from '@/api/map/index.js'
	import {
		onLoad,
		onShow,
		onReady,
		onPullDownRefresh,
		onReachBottom
	} from "@dcloudio/uni-app"
	import moment from 'moment'
	const start = '/static/device_normal.png'
	export default {
		setup() {
			const {
				proxy
			} = getCurrentInstance()
			onReady(() => {
				uni.getSystemInfo({ //获取高度
					success: (res) => {
						windowHeight.value = res.windowHeight;
					},
				});
			})
			onShow(() => {
				nextTick(() => {
					console.log('地图页面加载')
					getList()
				})
			})
			const toast = ref(null); //获取提示dom
			const markerList = ref([])
			const originMarkerList = ref([])
			const dataIndex = ref('')

			const show = ref(false)
			const state = ref({
				markers: [],
				_mapContext: null,
				query: {
					capCode: '',
					current: 1,
					orgId: uni.getStorageSync('storage_data').userInfo.orgId,
					size: 100000
				},
				dataList: [],
				originDataList: [],
				latitude: 31.52853, //纬度
				longitude: 120.28429, //经度
				mapDetail: {},
				latlon: {
					latitude: '',
					longitude: '',
				}
			})


			const openRepairPage = () => {
				let id = state.value.mapDetail.deviceId
				uni.navigateTo({
					url: `/pages/device/detail?id=${id}`
				})
			}
			//地图搜索
			const handelSearch = (e) => {
				console.log('地图点击了搜索')
				console.log(e.value)
				console.log('地图点击了搜索')
				if (e.value == '') {
					toast.value.show({
						type: 'error',
						icon: false,
						duration: 3000,
						message: "搜索不能为空"
					})
					return false
				}
				//微信小程序
				// #ifdef MP-WEIXIN
				state.value.dataList = []
				state.value.originDataList.forEach((item) => {
					if (item.deviceName && item.deviceName.includes(e.value)) {
						state.value.dataList.push(item)
					}
				})
				addMarkers()
				// #endif
				//APP
				// #ifdef APP-PLUS
				markerList.value = []
				originMarkerList.value.forEach((item) => {
					if (item.deviceName && item.deviceName.includes(e.value)) {
						markerList.value.push(item)
					}
				})
				// #endif
			}

			//取消地图搜索
			const handelCancel = (e) => {
				console.log('点击了清空')
				// #ifdef MP-WEIXIN
				state.value.dataList = []
				state.value.dataList = state.value.originDataList
				addMarkers()
				// #endif

				// #ifdef APP-PLUS
				markerList.value = []
				markerList.value = originMarkerList.value
				// #endif
			}
			// 弹出
			const popRef = ref()
			const windowHeight = ref(0);
			const latitude = ref(23.09) //纬度
			const longitude = ref(113.32) //经度
			//点击marker
			const markTap = (e) => {
				console.log(e)
				show.value = true;
				// #ifdef APP-PLUS
				let deviceId = markerList.value[e].deviceId
				// #endif
				// #ifdef MP-WEIXIN
				let deviceId = state.value.dataList[e.detail.markerId].deviceId
				// #endif
				getBoltDetail(deviceId).then(res => {
					state.value.mapDetail = res.data
					//弹出弹框
					popRef.value.open()
				})
			}
			// 取消弹框
			const cancel = () => {
				show.value = false;
				popRef.value.close()
			}
			//导航
			const chooseLocations = () => {
				uni.openLocation({
					latitude: Number(state.value.mapDetail.latitude),
					longitude: Number(state.value.mapDetail.longitude),
					scale: 15
				});
			}


			/*获取定位*/
			const getLocation = () => {
				uni.showLoading({
					title: '定位中'
				})
				uni.getLocation({
					type: 'gcj02',
					altitude: true,
					success: function(res) {
						console.log(res)
						state.value.latitude = res.latitude
						state.value.longitude = res.longitude
						state.value.latlon.latitude = res.latitude
						state.value.latlon.longitude = res.longitude
						uni.hideLoading()
					},
					fail: function() {
						console.log('获取位置信息失败');
						uni.hideLoading()
					}
				});
				// #ifdef MP-WEIXIN
				let mapObjs = uni.createMapContext('map', this)
				mapObjs.moveToLocation({
					latitude: state.value.latitude,
					longitude: state.value.longitude
				}, {
					complete: res => {
						console.log('移动完成:', res)
					}
				})
				// #endif
			}
			//增加markers
			const addMarkers = () => {
				const positions = state.value.dataList.map((item, index) => {
					return {
						latitude: item.latitude || 31.61505,
						longitude: item.longitude || 120.34179,
						id: index,
						online: item.online
					}
				})
				const markers = []
				positions.forEach((p, i) => {
					markers.push(
						Object.assign({}, {
							id: p.id,
							iconPath: p.online == true ? "/static/device_normal.png" :
								"/static/device_offline.png",
							width: 35,
							height: 34,
							joinCluster: false, // 指定了该参数才会参与聚合
							// callout: {
							// 	bgColor: "#5AC2EB",
							// 	color: "#fff",
							// 	content: `消防栓${p.id}`,
							// 	display: "ALWAYS",
							// 	fontSize: "14",
							// 	fontWeight: "bold",
							// 	padding: 8,
							// 	textAlign: "center"
							// },
						}, p)
					)
				})
				state.value.markers = markers
				// state._mapContext.addMarkers({
				// 	markers,
				// 	clear: false,
				// 	complete(res) {
				// 		// console.log('addMarkers', res)
				// 	}
				// })
			}
			/*获取列表数据*/
			const getList = () => {
				getMapList(uni.getStorageSync('storage_data').userInfo.orgId).then(res => {
					// #ifdef APP-PLUS
					markerList.value = res.data.devices || []
					originMarkerList.value = res.data.devices || []
					// #endif

					// #ifdef MP-WEIXIN
					state.value.dataList = res.data.devices || []
					state.value.originDataList = res.data.devices || []
					if (state.value.dataList.length > 0) {
						//将数据渲染到地图
						addMarkers()
					}
					// #endif
				})
			}
			// 下拉刷新
			onPullDownRefresh(() => {
				// loadData(true)
			})
			// 上拉加载
			onReachBottom(() => {
				// loadData()
			})
			const clickMsg = (item) => {
				uni.navigateTo({
					url: `/pages/msg/detail?id=${item.id}&createTime=${item.createTime}`
				})
			}
			//renderjs点击地图回调
			const onViewClick = (val) => {
				markTap(val)
			}
			return {
				markerList,
				getList,
				onViewClick,
				windowHeight,
				markTap,
				state,
				popRef,
				cancel,
				chooseLocations,
				openRepairPage,
				show,
				getLocation,
				addMarkers,
				handelSearch,
				toast,
				originMarkerList,
				handelCancel
			}
		}
	}
</script>
<script lang="renderjs" module="amap">
	export default {
		data() {
			return {
				show: false,
				ownerInstanceObj: null, //service层对象
				state: {
					markers: [],
					_mapContext: null,
					query: {
						capCode: '',
						current: 1,
						orgId: 123,
						size: 100000
					},
					dataList: [],
					latitude: 31.61505, //纬度
					longitude: 120.34179, //经度
					mapDetail: {}
				},
				popRef: '',
				windowHeight: 0,
				latitude: 23.09,
				longitude: 113.32,
				map: null,
				markerList: [],
				dataIndex: 0,
				latlon: {}
			}
		},
		mounted() { //先加载逻辑层再加载数据层 在监听回调里初始化地图
			console.log('mounted~~~~~~~~~~~~~~~`')
			// this.init()
		},
		methods: {
			// 引入高德地图SDK
			init() {
				if (typeof window.AMap == 'function') {
					this.initAmap();
				} else {
					// 动态引入较大类库避免影响页面展示
					const script = document.createElement('script');
					script.src = 'https://webapi.amap.com/maps?v=1.4.15&key=你的key';
					script.onload = this.initAmap.bind(this);
					document.head.appendChild(script);
				}
			},
			//初始化地图
			initAmap() {
				let lat = 120.34179
				let lon = 31.61505
				if (this.latlon && this.latlon.latitude) {
					lon = Number(this.latlon.latitude)
					lat = Number(this.latlon.longitude)
				}
				this.map = new AMap.Map('amap', {
					resizeEnable: true,
					// center: [120.34179, 31.61505],
					center: [lat, lon],
					// zooms: [14, 20], //设置地图级别范围
					zoom: 15,
				})
				this.map.on('complete', () => {
					console.log('加载完成')
					this.initMarkers()
				})
			},
			initMarkers() {
				let that = this;
				let prevMarker = null
				let prevIcon = null
				console.log('初始化markder')
				// var blueIcon = new AMap.Icon({
				// 	size: new AMap.Size(35, 34), // 设置图标大小
				// 	image: 'https://img1.baidu.com/it/u=4270144465,1604793144&fm=253&fmt=auto&app=120&f=JPEG?w=1280&h=800', // 设置图标样式
				// 	imageOffset: new AMap.Pixel(0, 0), // 设置图标偏移
				// 	imageSize: new AMap.Size(35, 34) // 设置图标尺寸
				// });
				this.markerList.forEach((item, index) => {

					if (item.online == true) {
						var blueIcon = new AMap.Icon({
							size: new AMap.Size(35, 34), // 设置图标大小
							image: 'https://fh-platform-test.obs.cn-east-3.myhuaweicloud.com/2024/1/7/1743806358433562626.png', // 设置图标样式
							imageOffset: new AMap.Pixel(0, 0), // 设置图标偏移
							imageSize: new AMap.Size(35, 34) // 设置图标尺寸
						});
					} else {
						var blueIcon = new AMap.Icon({
							size: new AMap.Size(35, 34), // 设置图标大小
							image: 'https://fh-platform-test.obs.cn-east-3.myhuaweicloud.com/2024/1/7/1743806505389391873.png', // 设置图标样式
							imageOffset: new AMap.Pixel(0, 0), // 设置图标偏移
							imageSize: new AMap.Size(35, 34) // 设置图标尺寸
						});
					}
					//添加点标记
					let marker = new AMap.Marker({
						position: new AMap.LngLat(Number(item.longitude), Number(item.latitude)),
						icon: blueIcon,
						draggable: true, // 设置 marker 可拖拽
						// zooms: [2, 12], //点标记显示的层级范围,超过范围不显示
						title: item.deviceId
					})

					marker.on('click', (e) => {
						that.dataIndex = index
						that.onClick(that.ownerInstanceObj)
					})

					this.map.add(marker)


				})
			},
			//监听逻辑层传递过来消火栓的数据
			updateEcharts(newValue, oldValue, ownerInstance, instance) {
				console.log('renderjs值发生了变化')
				this.markerList = newValue
				this.ownerInstanceObj = ownerInstance
				// 监听 service 层数据变更
				// this.ownerInstanceObj = ownerInstance
				// this.initMarkers()
				// this.initAmap()
				this.init()
			},
			//监听逻辑层传递过来的经纬度
			getLatlon(newValue) {
				console.log('renderjs值发生了变化')
				this.latlon = newValue
				this.initAmap()
			},
			onClick() {
				console.log('传值给service层')
				// 调用 service 层的方法
				this.$ownerInstance.callMethod('onViewClick', this.dataIndex)
			}
		}

	}
</script>
<style lang="scss" scoped>
	.location {
		width: 35px;
		height: 35px;
		background: #0079FE;
		display: flex;
		justify-content: center;
		border-radius: 50%;
		align-items: center;
		position: absolute;
		bottom: 100px;
		right: 30px;
		z-index: 55;
	}

	.bottom-popup {
		// height: 500px;

		z-index: 100;
		border-top-left-radius: 20px;
		border-top-right-radius: 20px;
		overflow: hidden;

		.bottom-title {
			width: 100%;
			background: #0079FE;
			color: #ffffff;
			display: flex;
			justify-content: space-between;
			padding: 0 20px;
			box-sizing: border-box;
			align-items: center;
			font-size: 20px;
			height: 50px;
			border-top-left-radius: 20px;
			border-top-right-radius: 20px;
			overflow: hidden;
		}

		.bottom-content {
			width: 100%;
			background-color: #FFFFFF;

			.bottom-item {
				display: flex;
				width: 100%;
				font-size: 16px;
				align-items: center;
				padding: 10px 20px;

				>view {
					&:nth-child(1) {
						width: 0%;
					}

					&:nth-child(2) {
						width: 20%;
					}

					&:nth-child(3) {
						width: 50%;
						height: 21px;
					}
				}

				.btns {
					background: #0079FE;
					color: #ffffff;
					border-radius: 20px;
					height: 30px;
					width: 60px;
					text-align: center;
					line-height: 30px;
					margin-left: 20px;
				}
			}
		}
	}
</style>

7.效果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/303242.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

视频号小店怎么上架商品?实操分享,干货满满!

我是电商珠珠 视频号小店从22年7月到现在也不过才发展了一年&#xff0c;它的风口才刚刚开始。 平台为了吸引商家入驻&#xff0c;会将大量红利向商家倾斜&#xff0c;只要把握住风口&#xff0c;就会很快起飞。 视频号小店对于很多人来说&#xff0c;都是新平台&#xff0c…

P9 视频码率及其码率控制方式

前言 从本章开始我们将要学习嵌入式音视频的学习了 &#xff0c;使用的瑞芯微的开发板 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ &#x1f525; 推荐专栏2: 《Linux C应用编程&#xff08;概念类&#xff09;_C…

技术学习周刊第 1 期

2018 年参与过 1 年的 ARTS 打卡&#xff0c;也因为打卡有幸加入了 MegaEase 能与皓哥&#xff08;左耳朵耗子&#xff09;共事。时过境迁&#xff0c;皓哥已经不在了&#xff0c;自己的学习梳理习惯也荒废了一段时间。 2024 年没给自己定具体的目标&#xff0c;只要求自己好好…

Tomcat 的 work 目录缓存导致的JSP页面图片更新问题

一、问题分析 1. 修改后重新部署没有变化 笔者之前部署了一个后台管理项目&#xff0c;通过它来发布课程内容&#xff0c;其中有一个 JSP 课程页面&#xff0c;在该 JSP 页面里也引用了类文件 Constant.java 里的一个变量&#xff08;ALIYUN_OSS_PATH&#xff09;&#xff0c;…

YOLOv5改进之---EIoU,SIoU,AlphaIoU,FocalEIoU,Wise-IoU

本文主要针对yolov5的iou损失函数进行改进,主要涵盖EIoU,SIoU,AlphaIoU,FocalEIoU,Wise-IoU这几种损失。 一、首先会对这几种损失进行介绍: 1、背景 由于EIOU是在CIOU的基础上改进的,为方便理解,此处贴出CIOU的计算公式,其他GIOU、DIOU不作介绍。 CIOU公式如下所示: b ,…

(二)Explain使用与详解

explain中的列 sql语句: EXPLAIN SELECT * from user WHERE userId=1340; 执行结果: 1. id列 id列的编号是 select 的序列号,有几个 select 就有几个id,并且id的顺序是按 select 出现的顺序增长的。 id列越大执行优先级越高,id相同则从上往下执行,id为NULL最后执行…

基于yolov2深度学习网络的车辆行人检测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 .......................................................... load yolov2.mat% 加载训练好的…

余震强度预测能力升级,Nature 刊文认证基于神经网络的模型性能优于传统模型

作者&#xff1a;李宝珠 编辑&#xff1a;李玮栋、xixi&#xff0c;三羊 地震的发生涉及诸多变量&#xff0c;「预测」存在挑战&#xff0c;但余震发生次数及强度的预测已取得重大进展。 2023 年 12 月 18 日 23 时 59 分&#xff0c;甘肃省临夏州积石山县发生 6.2 级地震&…

华清远见作业第二十三天——IO(第六天)

使用有名管道完成两个进程之间相互通信 代码&#xff1a; 创建管道&#xff1a; #include<a.h> int main(int argc, const char *argv[]) {//创建有名管道文件if(mkfifo("./myfifo1", 0664) ! 0){perror("mkfifo1 error");return -1;}printf("…

Open3D mesh模型平滑处理 (9)

Open3D mesh模型平滑处理 &#xff08;9&#xff09; 一、模型平滑示意图二、平滑函数介绍三、具体实现1.代码 一、模型平滑示意图 生成球体并添加高斯噪声的模型 平滑后&#xff0c;参数简单设置一下 二、平滑函数介绍 在Open3D中&#xff0c;filter_smooth_taubin方法的三…

分享一个小妙招,把文档制作成可翻页的电子书

​据统计数据显示&#xff0c;电子书的阅读人数正在逐年增长。随着人们对阅读方式的不断追求&#xff0c;可翻页的电子书将会成为一种新的趋势。因此&#xff0c;掌握这个小妙招&#xff0c;将有助于你在竞争激烈的市场中脱颖而出。 这个小妙招很简单&#xff0c;跟着我简单操作…

前端根据文件url路径判断文件预览或者下载以及自定义

需求&#xff1a; 点击不同附件浏览器查看效果不同&#xff0c;比如附近类型为pdf&#xff0c;则打开一个新的tab页在线预览&#xff0c;如果是zip包等&#xff0c;则直接下载&#xff0c;如果是image&#xff0c;则弹窗展示当前图片 如下图&#xff0c;服务端一般会把文件放…

PR、希喂、百利主食冻干哪款更好?铲龄8年真实喂养测评

随着对猫咪主食健康和营养问题的关注度提高&#xff0c;越来越多的铲屎官开始重视科学养猫。主食冻干因其模拟猫咪原始捕猎猎物模型配比、低温加工的特点&#xff0c;被认为是最符合猫咪饮食天性的选择。相比传统的膨化猫粮&#xff0c;主食冻干中的淀粉和碳水化合物添加较少&a…

机器学习(四) -- 模型评估(4)

系列文章目录 机器学习&#xff08;一&#xff09; -- 概述 机器学习&#xff08;二&#xff09; -- 数据预处理&#xff08;1-3&#xff09; 机器学习&#xff08;三&#xff09; -- 特征工程&#xff08;1-2&#xff09; 机器学习&#xff08;四&#xff09; -- 模型评估…

金和OA C6 CarCardInfo.aspx SQL注入漏洞复现

0x01 产品简介 金和网络是专业信息化服务商,为城市监管部门提供了互联网+监管解决方案,为企事业单位提供组织协同OA系统开发平台,电子政务一体化平台,智慧电商平台等服务。 0x02 漏洞概述 金和OA C6 CarCardInfo.aspx接口处存在SQL注入漏洞,攻击者除了可以利用 SQL 注入漏洞…

2024腾讯云免费服务器申请入口,限制及申请攻略亲测!

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM&#xff0c;轻量配置可选2核2G3M、2核8G7M和4核8G12M&#xff0c;CVM云服务器可选2核2G3M和2核4G3M配置&#xff0c;腾讯云百科txybk.com分享2024年最新腾讯云免费服务器…

01.08

#include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {//窗口设置//设置窗口名称this->setWindowTitle("chat");//设置窗口图标this->setWindowIcon(QIcon("D:\\Qt\\pictrue\\pictrue\\plant.svg"));//设置窗口大小this…

SpringBoot集成Camunda

一&#xff1a;pom.xml 因camunda集成SpringBoot对SpringBoot的版本和JDK的版本都有一定的要求&#xff0c;所以这里贴个完整的依赖。可以去官网找每个SpringBoot的版本对应的camunda版本。 <?xml version"1.0" encoding"UTF-8"?> <project x…

市场复盘总结 20240108

仅用于记录当天的市场情况,用于统计交易策略的适用情况,以便程序回测 短线核心:不参与任何级别的调整,采用龙空龙模式 今日空仓 最常用的二种方法: 方法一:指标选股找强势股 select * from dbo.ResultAll where 入选类型 like %指标选股% and 入选日期=20240108;方法二…

基于Java SSM框架实现时间管理系统项目【项目源码+论文说明】

基于java的SSM框架实现时间管理系统演示 摘要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于时间管理系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了时间管理…