2.点位管理|前后端如何交互——帝可得后台管理系统
目录
- 前言
- 点位管理菜单模块
- 1.需求说明
- 2.库表设计
- 3.生成基础代码
- 0 .使用若依代码生成器最终目标
- 1.创建点位管理
- 2.添加数据字典
- 3.配置代码生成信息
- 4.下载代码并导入项目
- 4.优化菜单——点位管理
- 1.优化区域管理
- 2.增加点位数
- 3. 合作商
- 4.区域管理中添加查看详情功能
- 5.合作商添加点位数量
- 6.重置合作商密码
- 7. 补充后端和前端是如何交互的?
前言
提示:本篇介绍点位管理模块,需求分析——建表设计——前后端代码生成——代码优化
点位管理菜单模块
1.需求说明
-
业务场景: 首先,我们需要确定几个有潜力的区域,这些区域可能是人流量大、消费能力高的商业区或居民区。然后,我们要与这些区域内的潜在合作商进行洽谈,比如商场、写字楼、学校等地方的管理者或所有者。一旦我们与合作商达成协议,确定了合作的细节和点位,我们就可以安排工作人员去投放智能售货机了。这些点位将成为我们智能售货机的“家”,为消费者提供便捷的购买服务。
-
分析设计模块和业务流程:
点位管理主要涉及到三个功能模块,业务流程如下:
- 登录系统:后台管理人员登录后台系统
- 新增区域: 后台管理人员可以添加区域范围,区域范围与运维/运维人员挂钩,区域下可关联点位。
- 新增合作商: 管理人员可以添加合作商,合作商与点位进行关联。
- 新增区域点位: 后台管理人员可以在特定区域内新增点位,这些点位是放置智能售货机的具体位置。

2.库表设计
表的设计涉及到页面原型,根据页面原型设计表结构;
完整的页面原型如下:页面原型,下图中只是截取了重要的而部分;
- 区域管理页面原型:

- 点位管理页面原型:

- 合作商管理页面原型:

- 根据上图进行分析:得到三个表;
1,区域表:字段有主键id、区域名称
2,合作商表:字段有主键id、合作商名称、联系人、联系电话、分成比例(int类型)、账号、密码
3,点位表:字段有主键id、点位名称、详细地址、商圈类型(int类型)
- 根据表信息,使用AI进行表结构创建,提示词如下:
你是一位软件工程师,帮我生成MySQL的表结构
需求如下:
1,区域表,表名tb_region,字段有主键id、区域名称
2,合作商表,表名tb_partner,字段有主键id、合作商名称、联系人、联系电话、分成比例(int类型)、账号、密码
3,点位表,表名tb_node,字段有主键id、点位名称、详细地址、商圈类型(int类型)
其他要求:
1,每张表中都有创建时间(create_time)、修改时间(date_time)、创建人(create_by)、修改人(update_by)、备注(remark)这些字段
2,每张表的主键都是自增的
3,区域与点位是一对多的关系,合作商与点位是一对多的关系,请用字段表示出来,并建立外键约束
4,请为所有字段都添加上comment
5,帮我给生成的表中插入一些北京城市相关区域、点位、合作商的测试数据```
- 生成内容 如下:
CREATE TABLE `tb_region` (`id` INT AUTO_INCREMENT COMMENT '主键id' PRIMARY KEY,`region_name` VARCHAR(255) NOT NULL COMMENT '区域名称',`create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',`create_by` VARCHAR(64) COMMENT '创建人',`update_by` VARCHAR(64) COMMENT '修改人',`remark` TEXT COMMENT '备注'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='区域表';-- 插入测试数据
INSERT INTO `tb_region` (`region_name`,`remark`) VALUES ('北京市朝阳区','北京市朝阳区'), ('北京市海淀区','北京市海淀区'), ('北京市东城区','北京市东城区');CREATE TABLE `tb_partner` (`id` INT AUTO_INCREMENT COMMENT '主键id' PRIMARY KEY,`partner_name` VARCHAR(255) NOT NULL COMMENT '合作商名称',`contact_person` VARCHAR(64) COMMENT '联系人',`contact_phone` VARCHAR(15) COMMENT '联系电话',`profit_ratio` INT COMMENT '分成比例',`account` VARCHAR(64) COMMENT '账号',`password` VARCHAR(64) COMMENT '密码',`create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',`create_by` VARCHAR(64) COMMENT '创建人',`update_by` VARCHAR(64) COMMENT '修改人',`remark` TEXT COMMENT '备注'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='合作商表';-- 插入测试数据
INSERT INTO `tb_partner` (`partner_name`, `contact_person`, `contact_phone`, `profit_ratio`, `account`, `password`) VALUES
('合作商A', '张三', '13800138000', 30, 'a001', 'pwdA'),
('合作商B', '李四', '13912345678', 25, 'b002', 'pwdB');CREATE TABLE `tb_node` (`id` INT AUTO_INCREMENT COMMENT '主键id' PRIMARY KEY,`node_name` VARCHAR(255) NOT NULL COMMENT '点位名称',`address` VARCHAR(255) NOT NULL COMMENT '详细地址',`business_type` INT COMMENT '商圈类型',`region_id` INT COMMENT '区域ID',`partner_id` INT COMMENT '合作商ID',`create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',`create_by` VARCHAR(64) COMMENT '创建人',`update_by` VARCHAR(64) COMMENT '修改人',`remark` TEXT COMMENT '备注',FOREIGN KEY (`region_id`) REFERENCES `tb_region`(`id`) ON DELETE CASCADE ON UPDATE CASCADE,FOREIGN KEY (`partner_id`) REFERENCES `tb_partner`(`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='点位表';-- 插入测试数据
-- 假设区域ID为1对应'北京市朝阳区',合作商ID为1对应'合作商A'
INSERT INTO `tb_node` (`node_name`, `address`, `business_type`, `region_id`, `partner_id`) VALUES
('三里屯点位', '北京市朝阳区三里屯路', 1, 1, 1),
('五道口点位', '北京市海淀区五道口', 2, 2, 2);
3.生成基础代码
0 .使用若依代码生成器最终目标

1.创建点位管理

2.添加数据字典
先创建商圈的字典类型
再创建商圈的字典数据

3.配置代码生成信息
导入三张表

配置合作商表(参考原型)

配置区域表(参考原型)

配置点位表(参考原型)

4.下载代码并导入项目
选中三张表生成下载

解压ruoyi.zip得到前后端代码和动态菜单sql

代码导入


调整二级菜单显示顺序

4.优化菜单——点位管理
1.优化区域管理
修改主键id,删除操图案;

优化后:

2.增加点位数
-
前端修改

-
后端修改
- Mysql语句创建:
-- 传统模式
-- 1.先聚合统计每个区域下的点位数
-- 确定查询表 tb_node
-- 确定分组字段 region_id
select region_id,count(*) as node_count from tb_node group by region_id;
-- 2.然后与区域表进行关联查询
select r.id,r.region_name,r.remark,ifnull(n.node_count,0) as node_count from tb_region rleft join (select region_id,count(*) as node_count from tb_node group by region_id) n on r.id=n.region_id;-- AI辅助编程模式
-- 查询区域表所有的信息,需要显示每个区域的点位数
SELECT r.*, COUNT(n.id) AS node_count FROM tb_region r LEFT JOIN tb_node n ON r.id = n.region_id GROUP BY r.id;
-
创建实体类

-
创建RegionMapper以及RegionMapper.xml
/*** 查询区域管理列表* @param region* @return RegionVo集合*/
public List<RegionVo> selectRegionVoList(Region region);
<select id="selectRegionVoList" resultType="com.dkd.manage.domain.vo.RegionVo">select r.id,r.region_name,r.remark,ifnull(n.node_count,0) as node_count from tb_region rleft join (select region_id,count(*) as node_count from tb_node group by region_id) n on r.id=n.region_id<where><if test="regionName != null and regionName != ''"> and r.region_name like concat('%', #{regionName}, '%')</if></where></select>
- 修改IRegionService接口以及实现类
/*** 查询区域管理列表* @param region* @return RegionVo集合*/
public List<RegionVo> selectRegionVoList(Region region);
/*** 查询区域管理列表* @param region* @return RegionVo集合*/
@Override
public List<RegionVo> selectRegionVoList(Region region) {return regionMapper.selectRegionVoList(region);
}
- 修改RegionControlller类
/*** 查询区域管理列表*/
@PreAuthorize("@ss.hasPermi('manage:region:list')")
@GetMapping("/list")
public TableDataInfo list(Region region)
{startPage();List<RegionVo> voList = regionService.selectRegionVoList(region);return getDataTable(voList);
}
3. 合作商
-
调整字段顺序
-
分成比例展示为百分之形式
-
删除 操作中修改/删改前的图标
1-3 操作如下图

-
新增时不展示明文密码
-
修改时显示创建时间字段
-
新增和删除时展示界面不同
4-6操作如下图

-
数据库种的密码展示应为加密类型

最终效果如下图:id=5 密码不展示明文

4.区域管理中添加查看详情功能
修改src\views\manage\partner\index.vue文件:
<el-button link type="primary" @click="getPartnerInfo(scope.row)"v-hasPermi="['manage:partner:query']">查看详情</el-button><!-- 查看合作商详情 --><el-dialog title="合作商详情" v-model="partnerInfoOpen" width="600px" append-to-body center><el-descriptions :column="2" border><el-descriptions-item label="合作商名称">{{ form.partnerName }}</el-descriptions-item><el-descriptions-item label="账号">{{ form.account }}</el-descriptions-item><el-descriptions-item label="联系人">{{ form.contactPerson }}</el-descriptions-item><el-descriptions-item label="联系电话">{{ form.contactPhone }}</el-descriptions-item><el-descriptions-item label="分成比例"><el-tag type="success">{{ form.profitRatio }}%</el-tag></el-descriptions-item><el-descriptions-item label="创建时间">{{ form.createTime }}</el-descriptions-item></el-descriptions></el-dialog>
/* 查看合作商详情 */
const partnerInfoOpen = ref(false);
function getPartnerInfo(row) {reset();const _id = row.id;getPartner(_id).then(response => {form.value = response.data;partnerInfoOpen.value = true;});
}
最终效果:

5.合作商添加点位数量
- MySQL语句分析
-- AI辅助编程模式
-- 你是一个软件开发工程师,现在要根据数据库的sql脚本,查询并显示合作商表所有的字段信息,同时显示每个合作商的点位数,sql脚本如下
create table tb_node
(id int auto_increment comment '主键id'primary key,node_name varchar(255) not null comment '点位名称',address varchar(255) not null comment '详细地址',business_type int null comment '商圈类型',region_id int null comment '区域ID',partner_id int null comment '合作商ID',create_time timestamp default CURRENT_TIMESTAMP null comment '创建时间',update_time timestamp default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP comment '修改时间',create_by varchar(64) null comment '创建人',update_by varchar(64) null comment '修改人',remark text null comment '备注',constraint tb_node_ibfk_1foreign key (region_id) references tb_region (id)on update cascade on delete cascade,constraint tb_node_ibfk_2foreign key (partner_id) references tb_partner (id)on update cascade on delete cascade
)comment '点位表';create table tb_partner
(id int auto_increment comment '主键id'primary key,partner_name varchar(255) not null comment '合作商名称',contact_person varchar(64) null comment '联系人',contact_phone varchar(15) null comment '联系电话',profit_ratio int null comment '分成比例',account varchar(64) null comment '账号',password varchar(64) null comment '密码',create_time timestamp default CURRENT_TIMESTAMP null comment '创建时间',update_time timestamp default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP comment '修改时间',create_by varchar(64) null comment '创建人',update_by varchar(64) null comment '修改人',remark text null comment '备注'
)comment '合作商表';
- domain层
package com.dkd.manage.domain.vo;import com.dkd.manage.domain.Partner;
import lombok.Data;@Data
public class PartnerVo extends Partner {//点位数量private Integer nodeCount;
}
- mapper层

/*** 查询合作商管理列表* @param partner* @return partnerVo集合*/public List<PartnerVo> selectPartnerVoList(Partner partner);

<select id="selectPartnerVoList" resultType="com.dkd.manage.domain.vo.PartnerVo"parameterType="Partner">SELECTp.id,p.partner_name,p.contact_person,p.contact_phone,p.profit_ratio,p.account,COUNT(n.id) AS node_countFROMtb_partner pLEFT JOINtb_node n ON p.id = n.partner_id<where><if test="partnerName != null and partnerName != ''">and p.partner_name like concat('%', #{partnerName}, '%')</if></where>GROUP BYp.id</select>
- service层
IPartnerService
/*** 查询合作商列表** @param partner 合作商* @return 合作商*/public List<PartnerVo> selectPartnerVoList(Partner partner);
PartnerServiceImpl
/*** 查询合作商列表** @param partner 合作商* @return 合作商*/@Overridepublic List<PartnerVo> selectPartnerVoList(Partner partner){return partnerMapper.selectPartnerVoList(partner);}
- controller层
修改PartnerController
/*** 查询合作商列表*/@PreAuthorize("@ss.hasPermi('manage:partner:list')")@GetMapping("/list")public TableDataInfo list(Partner partner){startPage();List<PartnerVo> listVo = partnerService.selectPartnerVoList(partner);return getDataTable(listVo);}
- 最终效果:

6.重置合作商密码
-
查看API文档
请求路径: /manage/partner/resetPwd/:id


-
编写controller
/** 重置合作商密码* /manage/partner/resetPwd/:id* */@PreAuthorize("@ss.hasPermi('manage:partner:edit')")@Log(title = "重置合作商密码", businessType = BusinessType.UPDATE)@PutMapping("/resetPwd/{id}")public AjaxResult resetpwd(@PathVariable Long id) {//1. 接收参数//2. 创建合作商对象Partner partner = new Partner();partner.setId(id);// 设置idpartner.setPassword(SecurityUtils.encryptPassword("123456"));// 设置加密后的初始密码//3. 调用service更新密码return toAjax(partnerService.updatePartner(partner));}
- 修改前端
在partner/index.vue视图组件中
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="300px"><template #default="scope"><el-button link type="primary" @click="resetPwd(scope.row)" v-hasPermi="['manage:partner:edit']">重置密码</el-button></template></el-table-column><script>import { listPartner, getPartner, delPartner, addPartner, updatePartner,resetPartnerPwd } from "@/api/manage/partner";/* 重置合作商密码 */function resetPwd(row) {proxy.$modal.confirm('你确定要重置该合作商密码吗?').then(function () {return resetPartnerPwd(row.id);}).then(() => {proxy.$modal.msgSuccess("重置成功");}).catch(() => { });}
</script>
在manage/partner.js请求api中
// 重置合作商密码
export function resetPartnerPwd(id){return request({url: '/manage/partner/resetPwd/' + id,method: 'put'})
}
整体执行流程:
- 当用户点击重置密码时,会触发@click="resetPwd(scope.row)"函数;
- 该代码会弹出窗口,你是否重置合作商密码;
- 当用户点击取消时,会直接执行catch,其逻辑为空,就是什么也不用做;
- 当用户点击是的时候,会调用resetPartnerPwd(row.id)方法,该方法会向后端http://127.0.0.1:8080/manage/partner/resetPwd/{id}发起请求,并将结果返回给浏览器; - 后端向前端的响应为:{“msg”:“操作成功”,“code”:200}
- 无论响应结果如何(不管code是200|500),都会接着执行then后的 proxy.$modal.msgSuccess(“重置成功”);
/* 重置合作商密码 */function resetPwd(row) {proxy.$modal.confirm('你确定要重置该合作商密码吗?').then(function () {return resetPartnerPwd(row.id);}).then(() => {proxy.$modal.msgSuccess("重置成功");}).catch(() => { });}
</script>
// 重置合作商密码
export function resetPartnerPwd(id){return request({url: '/manage/partner/resetPwd/' + id,method: 'put'})
}
7. 补充后端和前端是如何交互的?
我们以修改合作商为例:
当前端点击重置密码时,请求地址是:http://localhost/dev-api/manage/partner/resetPwd/1
在前端.env.development中,有如下代码:
// vite 相关配置server: {port: 80,host: true,open: true,proxy: {// https://cn.vitejs.dev/config/#server-proxy'/dev-api': {target: 'http://127.0.0.1:8080',// target: 'https://api.wzs.pub/mock/13',changeOrigin: true,rewrite: (p) => p.replace(/^\/dev-api/, '')}}},
该代码的意思是将 http://localhost/dev-api/ 替换为 空字符串;
并将其转发到 http://127.0.0.1:8080/manage/partner/resetPwd/{id};
那么后端是如何知道自己该调用那个方法去修改密码呢?
在后端application.yml中,有如下代码:
# 开发环境配置
server:# 服务器的HTTP端口,默认为 8080port: 8080servlet:# 应用的访问路径context-path: /tomcat:# tomcat的URI编码uri-encoding: UTF-8# 连接数满后的排队数,默认为100accept-count: 1000threads:# tomcat最大线程数,默认为200max: 800# Tomcat启动初始化的线程数,默认值10min-spare: 100
该段代码确定了Spring的配置环境,配置的环境就是前端提到的 http://127.0.0.1:8080;
在PartnerController.java文件中

在 Spring Boot 的控制器类上会有一个类级别的 @RequestMapping 注解/manage/partner,然后在具体的方法上,会有方法级别的映射,如你所见的 @PutMapping(“/resetPwd/{id}”);
最后后端地址就可以拼接为:http://127.0.0.1:8080/manage/partner/resetPwd/{id},也就是前端转发的请求地址;
这个时候后端就知道调用resetPwd()方法;
相关文章:
2.点位管理|前后端如何交互——帝可得后台管理系统
目录 前言点位管理菜单模块1.需求说明2.库表设计3.生成基础代码0 .使用若依代码生成器最终目标1.创建点位管理2.添加数据字典3.配置代码生成信息4.下载代码并导入项目 4.优化菜单——点位管理1.优化区域管理2.增加点位数3. 合作商4.区域管理中添加查看详情功能5.合作商添加点位…...
Redis基础二(spring整合redis)
Springboot整合Redis 一、Springboot整合redis redis可以通过使用java代码来实现 第一部分文档中 在终端操作redis的所有命令,Spring已经帮我们封装了所有的操作,所以变得很简单了。 Spring专门提供了一个模块来进行这些操作的封装,这…...
JAVA开源项目 教学资源库系统 计算机毕业设计
本文项目编号 T 067 ,文末自助获取源码 \color{red}{T067,文末自助获取源码} T067,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计5.4.1 管…...
二分查找算法专题(2)
找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏: 优选算法专题 对于二分查找算法不是很了解或者只了解一部分的小伙伴一定要去看下面这篇博客:二分查找算法的介绍与另外一种查找方…...
[Python] 编程入门:理解变量类型
文章目录 [toc] 整数常见操作 浮点数字符串字符串中混用引号问题字符串长度计算字符串拼接 布尔类型动态类型特性类型转换结语 收录专栏:[Python] 在编程中,变量是用于存储数据的容器,而不同的变量类型则用来存储不同种类的数据。Python 与 C…...
C(九)while循环 --- 军训匕首操情景
匕首操,oi~oi~oi~~~~~ 接下来的几篇推文,杰哥记录的是三大循环结构的运行流程及其变式。 本篇的主角是while循环。👉 目录: while循环 的组成、运行流程及其变式关键字break 和 continue 在while 循环中的作用while 循环的嵌套题目…...
C#秒如何转为时分秒格式
将秒数转换为分钟和秒数可以通过简单的数学运算来实现。假设你有一个整数表示秒数,可以通过以下方式转换为分钟: 将秒数除以 3600 来获取时钟的整数部分。 将秒数求余 3600的结果除以60 来获取分钟的整数部分。 用秒数求余 60 来获取余下的秒数。 具体实现函数如下: //…...
重学SpringBoot3-集成Redis(三)
更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(三) 1. 引入 Redis 依赖2. 配置 RedisCacheManager 及自定义过期策略2.1 示例代码:自定义过期策略 3. 配置…...
【Spine】引入PhotoshopToSpine脚本
引入 右键Photoshop图标,选择属性 打开文件所在位置 找到目录下的\Presets\Scripts文件夹。 找到Spine目录下的\scripts\photoshop文件夹下的PhotoshopToSpine.jsx 复制它,丢到Photoshop刚才找的那个目录下。 使用 打开.psd文件,检查不要…...
【Linux】详解Linux下的工具(内含yum指令和vim指令)
文章目录 前言1. Linux下软件安装的方式2. yum2.1 软件下载的小知识2.2 在自己的Linux系统下验证yum源的存在2.3 利用yum指令下载软件2.4 拓展yum源(针对于虚拟机用户) 3. vim编辑器3.1 vim是什么?3.2 如何打开vim3.2 vim各模式下的讲解3.2.1…...
MacBook 使用 brew 安装 MySQL
目录 (1)准备工作1.1 更新 brew (2)正式安装2.1 安装MySQL:2.2 启动mysql (3)初始化数据库3.1 选择验证密码组件3.2 密码强度3.3 删除匿名用户3.4 禁用root用户远程连接3.5 删除test数据库3.6 重…...
java中有两个list列表,尽量少的去循环
java中有两个list列表,一个list列表是paymentRecord,另外一个list是listApplyBase,paymentRecord中的lendCode字段值跟listApplyBase中的repaymentCode字段值是对应的,用stream流去循环paymentRecord列表,然后判断当pa…...
Java中的状态机实现:使用Spring State Machine管理复杂状态流转
在软件开发中,我们经常会遇到需要处理各种状态以及状态之间转换的场景。这些状态转换有时会变得非常复杂,特别是当涉及到多个状态,并且每个状态都有多个可能的触发事件导致不同的状态变化时。手动编写这样的逻辑不仅容易出错,而且…...
[Notes] Computer Network - Overwiew
What is the Internet? The Internet is a global network of interconnected computers that communicate using standard protocols (rules). It’s not a single entity but a network of networks that allows millions of devices worldwide to exchange data. In simp…...
MyBatisPlus——学习笔记
MyBatisPlus 一、导入依赖 <!-- MyBatisPlus --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</version></dependency><!-- MySql --><de…...
运维自动化shell脚本总结
运维自动化是提升IT管理效率的关键,使用Shell脚本可以有效地实现许多日常任务的自动化。以下是一些常见的Shell脚本应用及其总结,涵盖基本概念、实用示例和最佳实践。 1. Shell脚本基础 1.1 Shell脚本定义 Shell脚本是一系列命令的集合,通…...
前端学习第三天笔记 JavaScript JavaScript的引入 数据类型 运算符 条件语句 字符串
这里写自定义目录标题 JavaScriptJavaScript引入到文件嵌入到HTML文件中引入本地独立js文件引入网络来源文件 JavaScript的注释方式嵌入在HTML文件中的注释JavaScript的输出方式数据类型原始类型(基础类型)合成类型(复合类型) 运算…...
C++教程一口气讲完!(万字讲解)( ̄y▽ ̄)╭ Ohohoho... 下
C 常量 常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。 常量可以是任何的基本数据类型,可分为整型数字、浮点数字、字符、字符串和布尔值。 常量就像是常规的变量,只不过常量的值在定义后不能进行修改。 …...
unity软件安装教程
目录 一、Unity Hub的安装 二、Unity Hub的基础设置 语言切换 安装默认路径 安装unity编辑器和visual Studio 申请许可证 创建新项目 Unity和Visual Studio进行绑定 一、Unity Hub的安装 打开浏览器输入以下网址:unity.cn,打开unity官网 点击下载&#x…...
[大语言模型-论文精读] 更大且更可指导的语言模型变得不那么可靠
[大语言模型-论文精读] 更大且更可指导的语言模型变得不那么可靠 目录 文章目录 [大语言模型-论文精读] 更大且更可指导的语言模型变得不那么可靠目录0. 摘要1. 核心内容3. 创新点4. 算法模型5. 实验效果6. 重要数据与实验结论7. 推荐阅读指数:8. 推荐理由 后记 论文…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
