今天接受了一个捕鱼的源码,技术栈采用:

  1. 客户端:Unity
  2. 服务端:Java
  3. 数据库:mysql
  4. 缓存:redis

先来几张成品图

​编辑​编辑

​编辑​编辑

​编辑

在代码中看到有腾讯推广渠道,这套不管是代码质量还是游戏画质都是非常不错的。而且不关有捕鱼还有拉霸类型的游戏。cdk兑换实物兑换商城等功能。

​编辑

​编辑

package com.maple.game.osee.controller.gm;

import com.maple.database.config.redis.RedisHelper;
import com.maple.database.data.entity.UserEntity;
import com.maple.database.data.mapper.UserMapper;
import com.maple.engine.anotation.GmController;
import com.maple.engine.anotation.GmHandler;
import com.maple.engine.utils.JsonMapUtils;
import com.maple.game.osee.controller.gm.base.GmBaseController;
import com.maple.game.osee.dao.data.entity.AgentEntity;
import com.maple.game.osee.dao.data.mapper.AgentMapper;
import com.maple.game.osee.dao.log.entity.AgentCommissionInfoEntity;
import com.maple.game.osee.dao.log.entity.AgentWithdrawLogEntity;
import com.maple.game.osee.dao.log.mapper.AgentCommissionInfoMapper;
import com.maple.game.osee.dao.log.mapper.AgentCommissionMapper;
import com.maple.game.osee.dao.log.mapper.AgentWithdrawLogMapper;
import com.maple.game.osee.entity.gm.CommonResponse;
import com.maple.game.osee.manager.AgentManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils; import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.ThreadLocalRandom; /**
* 渠道商代理控制器
*/
@GmController
public class GmChannelAgentController extends GmBaseController { @Autowired
private AgentMapper agentMapper; @Autowired
private AgentManager agentManager; @Autowired
private AgentCommissionMapper agentCommissionMapper; @Autowired
private AgentCommissionInfoMapper agentCommissionInfoMapper; @Autowired
private AgentWithdrawLogMapper agentWithdrawLogMapper; /**
* 初始分成比例关键字
*/
private static final String INIT_RATE = "Ttmy:Agent:FirstRate"; /**
* 提现申请周期
*/
private static final String FLUSH_TIME = "Ttmy:Agent:FlushTime"; /**
* 获取初始分成比例
*/
private static double getInitRate() {
String rateStr = RedisHelper.get(INIT_RATE);
return StringUtils.isEmpty(rateStr) ? 0.01 : Double.parseDouble(rateStr);
} /**
* 设置初始分成比例
*/
private static void setInitRate(Double initRate) {
RedisHelper.set(INIT_RATE, initRate.toString());
} /**
* 获取提现周期
*/
public static int getFlushTime() {
String rateStr = RedisHelper.get(FLUSH_TIME);
return StringUtils.isEmpty(rateStr) ? 7 : Integer.parseInt(rateStr);
} /**
* 设置提现周期
*/
public static void setFlushTime(Integer flushTime) {
RedisHelper.set(FLUSH_TIME, flushTime.toString());
} /**
* 渠道列表
*/
@GmHandler(key = "/ttmy/channel/list")
public void doChannelAgentList(Map<String, Object> params, CommonResponse response) throws Exception {
List<Map<String, Object>> agentList = new LinkedList<>(); // 查询销售金额和佣金的查询条件
StringBuilder condBuilder = new StringBuilder("WHERE 1=1");
StringBuilder pageBuilder = new StringBuilder(); // 解析数据
int page = JsonMapUtils.parseObject(params, "page", JsonMapUtils.JsonInnerType.TYPE_INT);
int pageSize = JsonMapUtils.parseObject(params, "pageSize", JsonMapUtils.JsonInnerType.TYPE_INT); pageBuilder.append(" LIMIT ").append((page - 1) * pageSize).append(", ").append(pageSize); for (Map.Entry<String, Object> entry : params.entrySet()) {
String key = entry.getKey();
switch (key) {
case "startTime":
long startTime = JsonMapUtils.parseObject(params, "startTime", JsonMapUtils.JsonInnerType.TYPE_LONG);
if (startTime > 0) {
condBuilder.append(" AND create_time >= '").append(DATE_FORMATER.format(startTime)).append("'");
}
break;
case "endTime":
long endTime = JsonMapUtils.parseObject(params, "endTime", JsonMapUtils.JsonInnerType.TYPE_LONG);
if (endTime > 0) {
condBuilder.append(" AND create_time <= '").append(DATE_FORMATER.format(endTime)).append("'");
}
break;
case "playerId":
long id = JsonMapUtils.parseObject(params, "playerId", JsonMapUtils.JsonInnerType.TYPE_LONG);
if (id > 0) {
condBuilder.append(" AND player_id = ").append(id);
}
break;
case "nickname":
String nickname = JsonMapUtils.parseObject(params, "nickname", JsonMapUtils.JsonInnerType.TYPE_STRING);
if (!StringUtils.isEmpty(nickname)) {
condBuilder.append(" AND player_name = '").append(nickname).append("'");
}
break;
}
}
condBuilder.append(" AND agent_level = 1"); // 只查询一级代理
List<AgentEntity> agentEntityList = agentMapper.getAgentList(condBuilder.toString(), pageBuilder.toString());
int totalNum = agentMapper.getAgentCount(condBuilder.toString()); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
for (AgentEntity agentEntity : agentEntityList) {
Map<String, Object> agentItem = new HashMap<>(); int totalPerson = 0, dailyPerson = 0;
List<AgentEntity> entities = agentMapper.getByAgentPlayerId(agentEntity.getPlayerId());
totalPerson += entities.size();
for (AgentEntity entity : entities) {
if (sdf.format(new Date()).equals(sdf.format(entity.getCreateTime()))) {
dailyPerson += 1;
} totalPerson += agentMapper.getAgentNextLevelCount(entity.getPlayerId());
dailyPerson += agentMapper.getDailyPlayerSize(entity.getPlayerId());
} long month;
if (params.containsKey("month")) {
month = JsonMapUtils.parseObject(params, "month", JsonMapUtils.JsonInnerType.TYPE_LONG);
} else {
month = System.currentTimeMillis();
}
String monthDate = new SimpleDateFormat("yyyy-MM").format(new Date(month)); agentItem.put("playerId", agentEntity.getPlayerId());
agentItem.put("nickname", agentEntity.getPlayerName());
agentItem.put("totalPersonNum", totalPerson);
agentItem.put("dailyPersonNum", dailyPerson);
agentItem.put("dailyRecharge", agentCommissionMapper.getDailyCommissionByAgentId(agentEntity.getPlayerId()));
agentItem.put("monthRecharge", agentCommissionMapper.getTargetMonthCommissionByAgentId(agentEntity.getPlayerId(), monthDate));
agentItem.put("totalRecharge", agentCommissionMapper.getTotalCommissionByAgentId(agentEntity.getPlayerId()));
agentItem.put("currentMoney", agentEntity.getTotalCommission());
agentItem.put("createTime", agentEntity.getCreateTime());
agentItem.put("rate", agentEntity.getFirstCommissionRate());
agentList.add(agentItem);
} Map<String, Object> resultMap = new HashMap<>();
resultMap.put("totalNum", totalNum);
resultMap.put("list", agentList);
resultMap.put("rate", getInitRate());
response.setData(resultMap);
} /**
* 删除渠道商
*/
@GmHandler(key = "/ttmy/channel/delete")
public void doChannelAgentDelete(Map<String, Object> params, CommonResponse response) throws Exception {
AgentEntity agentEntity = agentManager.getAgentInfoByPlayerId((long) (double) params.get("playerId")); if (agentEntity.getAgentLevel() == 1) {
if (!agentManager.deleteFirAgent(agentEntity)) {
response.setSuccess(false);
response.setErrMsg("删除失败1");
}
} else {
response.setSuccess(false);
response.setErrMsg("删除失败");
}
} /**
* 更新渠道商
*/
@GmHandler(key = "/ttmy/channel/update")
public void doChannelAgentUpdate(Map<String, Object> params, CommonResponse response) throws Exception {
long playerId = (long) (double) params.get("playerId");
double rate = (double) params.get("rate"); response.setSuccess(false);
if (rate > 100D) {
response.setErrMsg("分成比例不可大于100%");
return;
} List<AgentEntity> secAgents = agentMapper.getByAgentPlayerId(playerId);
for (AgentEntity agent : secAgents) {
if (agent.getSecondCommissionRate() != null && agent.getSecondCommissionRate() > rate) {
response.setErrMsg("员工:" + agent.getPlayerName() + "分成比例" + agent.getSecondCommissionRate() +
"大于" + rate + ",无法修改");
}
} AgentEntity agentEntity = agentManager.getAgentInfoByPlayerId(playerId);
if (agentEntity.getAgentLevel() == 1) {
if (rate < agentEntity.getFirstCommissionRate()) {
response.setErrMsg("不可小于原分成比例");
return;
} agentEntity.setFirstCommissionRate(rate);
agentMapper.update(agentEntity);
} else {
response.setErrMsg("渠道商id有误");
}
response.setSuccess(true);
} /**
* 修改渠道总分成比例
*/
@GmHandler(key = "/ttmy/channel/rate/update")
public void doChannelRateUpdate(Map<String, Object> params, CommonResponse response) throws Exception {
double rate = (double) params.get("rate");
int update = (int) (double) params.get("update"); if (update == 0) {
agentMapper.updateSameFirstRate(getInitRate(), rate);
} else {
agentMapper.updateAllFirstRate(rate);
}
setInitRate(rate);
} /**
* 获取渠道员工列表
*/
@GmHandler(key = "/ttmy/channel/promoter/list")
public void doChannelPromoterList(Map<String, Object> params, CommonResponse response) throws Exception {
List<Map<String, Object>> agentList = new LinkedList<>(); long channelId = (long) (double) params.get("channelId");
// 查询销售金额和佣金的查询条件
StringBuilder condBuilder = new StringBuilder("WHERE agent_player_id = " + channelId);
StringBuilder pageBuilder = new StringBuilder(); // 解析数据
int page = JsonMapUtils.parseObject(params, "page", JsonMapUtils.JsonInnerType.TYPE_INT);
int pageSize = JsonMapUtils.parseObject(params, "pageSize", JsonMapUtils.JsonInnerType.TYPE_INT); pageBuilder.append(" LIMIT ").append((page - 1) * pageSize).append(", ").append(pageSize); for (Map.Entry<String, Object> entry : params.entrySet()) {
String key = entry.getKey();
switch (key) {
case "promoterId":
long id = JsonMapUtils.parseObject(params, "promoterId", JsonMapUtils.JsonInnerType.TYPE_LONG);
if (id > 0) {
condBuilder.append(" AND player_id = ").append(id);
}
break;
case "promoterName":
String nickname = JsonMapUtils.parseObject(params, "promoterName", JsonMapUtils.JsonInnerType.TYPE_STRING);
if (!StringUtils.isEmpty(nickname)) {
condBuilder.append(" AND player_name = '").append(nickname).append("'");
}
break;
}
}
AgentEntity channelAgent = agentManager.getAgentInfoByPlayerId(channelId);
List<AgentEntity> agentEntityList = agentMapper.getAgentList(condBuilder.toString(), pageBuilder.toString());
int totalNum = agentMapper.getAgentCount(condBuilder.toString());
for (AgentEntity agentEntity : agentEntityList) {
Map<String, Object> agentItem = new HashMap<>();
long month;
if (params.containsKey("month")) {
month = JsonMapUtils.parseObject(params, "month", JsonMapUtils.JsonInnerType.TYPE_LONG);
} else {
month = System.currentTimeMillis();
}
String monthDate = new SimpleDateFormat("yyyy-MM").format(new Date(month)); agentItem.put("playerId", agentEntity.getPlayerId());
agentItem.put("nickname", agentEntity.getPlayerName());
agentItem.put("dailyPersonNum", agentMapper.getDailyPlayerSize(agentEntity.getPlayerId()));
agentItem.put("dailyRecharge", agentCommissionMapper.getDailyCommissionByAgentId(agentEntity.getPlayerId()));
agentItem.put("monthRecharge", agentCommissionMapper.getTargetMonthCommissionByAgentId(agentEntity.getPlayerId(), monthDate));
agentItem.put("totalRecharge", agentCommissionMapper.getTotalCommissionByAgentId(agentEntity.getPlayerId()));
agentItem.put("rate", agentEntity.getSecondCommissionRate() == null ? channelAgent.getSecondCommissionRate() : agentEntity.getSecondCommissionRate());
agentList.add(agentItem);
} Map<String, Object> resultMap = new HashMap<>();
resultMap.put("totalNum", totalNum);
resultMap.put("list", agentList);
resultMap.put("rate", channelAgent.getSecondCommissionRate());
resultMap.put("channelRate", channelAgent.getFirstCommissionRate());
response.setData(resultMap);
} /**
* 删除渠道员工
*/
@GmHandler(key = "/ttmy/channel/staff/delete")
public void doChannelStaffDelete(Map<String, Object> params, CommonResponse response) throws Exception {
long playerId = (long) (double) params.get("playerId");
AgentEntity agentEntity = agentManager.getAgentInfoByPlayerId(playerId);
if (agentEntity.getAgentLevel() == 2) {
if (!agentManager.deleteSecAgent(agentEntity)) {
response.setSuccess(false);
response.setErrMsg("删除失败");
}
} else {
response.setSuccess(false);
response.setErrMsg("该用户不为推广员");
}
} /**
* 修改渠道员工总分成比例
*/
@GmHandler(key = "/ttmy/channel/staff/rate/update")
public void doChannelStaffRateUpdate(Map<String, Object> params, CommonResponse response) {
AgentEntity agent = agentManager.getAgentInfoByPlayerId((long) (double) params.get("channelId"));
double rate = (double) params.get("rate");
int update = (int) (double) params.get("update");
if (rate > agent.getFirstCommissionRate()) {
response.setSuccess(false);
response.setErrMsg("员工分成不能大于渠道分成");
return;
} gmChannelAgentUserController.updateStaffRate(agent, rate, update);
} /**
* 修改指定渠道员工分成比例
*/
@GmHandler(key = "/ttmy/channel/staff/user_rate/update")
public void doChannelStaffUserRateUpdate(Map<String, Object> params, CommonResponse response) {
AgentEntity agent = agentManager.getAgentInfoByPlayerId((long) (double) params.get("channelId"));
long playerId = (long) (double) params.get("playerId");
String nickname = params.get("nickname").toString();
double rate = (double) params.get("rate");
if (agent.getFirstCommissionRate() != null && rate > agent.getFirstCommissionRate()) {
response.setSuccess(false);
response.setErrMsg("员工分成不能大于渠道分成");
return;
} gmChannelAgentUserController.updateUserStaffRate(agent, rate, playerId, nickname, response);
} /**
* 渠道提现申请列表
*/
@GmHandler(key = "/ttmy/channel/withdraw/list")
public void doChannelWithdrawList(Map<String, Object> params, CommonResponse response) throws Exception {
StringBuilder condBuilder = new StringBuilder("and agent.agent_level = 1");
StringBuilder pageBuilder = new StringBuilder(); // 解析数据
int page = JsonMapUtils.parseObject(params, "page", JsonMapUtils.JsonInnerType.TYPE_INT);
int pageSize = JsonMapUtils.parseObject(params, "pageSize", JsonMapUtils.JsonInnerType.TYPE_INT); pageBuilder.append(" LIMIT ").append((page - 1) * pageSize).append(", ").append(pageSize); for (Map.Entry<String, Object> entry : params.entrySet()) {
String key = entry.getKey();
switch (key) {
case "startTime":
long startTime = JsonMapUtils.parseObject(params, "startTime", JsonMapUtils.JsonInnerType.TYPE_LONG);
if (startTime > 0) {
Date date = new Date(startTime);
condBuilder.append(" AND log.create_time >= '").append(DATE_FORMATER.format(date)).append("'");
}
break;
case "endTime":
long endTime = JsonMapUtils.parseObject(params, "endTime", JsonMapUtils.JsonInnerType.TYPE_LONG);
if (endTime > 0) {
Date date = new Date(endTime);
condBuilder.append(" AND log.create_time <= '").append(DATE_FORMATER.format(date)).append("'");
}
break;
case "channelId":
long id = JsonMapUtils.parseObject(params, "channelId", JsonMapUtils.JsonInnerType.TYPE_LONG);
if (id > 0) {
condBuilder.append(" AND log.channel_id = ").append(id);
}
break;
case "nickname":
String nickname = JsonMapUtils.parseObject(params, "nickname", JsonMapUtils.JsonInnerType.TYPE_STRING);
if (!StringUtils.isEmpty(nickname)) {
condBuilder.append(" AND agent.player_name = '").append(nickname).append("'");
}
break;
case "state":
long state = JsonMapUtils.parseObject(params, "state", JsonMapUtils.JsonInnerType.TYPE_LONG);
condBuilder.append(" AND log.state = ").append(state - 1);
break;
}
}
List<Map<String, Object>> withdrawInfoList = agentWithdrawLogMapper.getMapList(condBuilder.toString(), pageBuilder.toString());
int totalNum = agentWithdrawLogMapper.getMapCount(condBuilder.toString()); List<Map<String, Object>> withdrawDatas = new ArrayList<>();
for (Map<String, Object> withdrawInfo : withdrawInfoList) {
Map<String, Object> withdrawData = new HashMap<>();
withdrawData.put("id", withdrawInfo.get("id"));
withdrawData.put("channelId", withdrawInfo.get("agent_id"));
withdrawData.put("nickname", withdrawInfo.get("player_name"));
withdrawData.put("money", withdrawInfo.get("money"));
withdrawData.put("bank", withdrawInfo.get("bank"));
withdrawData.put("accountName", withdrawInfo.get("real_name"));
withdrawData.put("cardNo", withdrawInfo.get("bank_num"));
withdrawData.put("bankName", withdrawInfo.get("open_bank"));
withdrawData.put("creator", withdrawInfo.get("creator"));
withdrawData.put("state", ((int) withdrawInfo.get("state")) + 1);
withdrawData.put("createTime", ((Date) withdrawInfo.get("create_time")).getTime());
withdrawDatas.add(withdrawData);
} Map<String, Object> data = new HashMap<>();
data.put("list", withdrawDatas);
data.put("totalNum", totalNum);
data.put("time", getFlushTime());
response.setData(data);
} /**
* 修改提现申请周期
*/
@GmHandler(key = "/ttmy/channel/withdraw/time/update")
public void doChannelWithdrawTimeUpdate(Map<String, Object> params, CommonResponse response) throws Exception {
setFlushTime(((Double) params.get("time")).intValue());
} /**
* 修改提现状态
*/
@GmHandler(key = "/ttmy/channel/withdraw/state/update")
public void doChannelWithdrawStateUpdate(Map<String, Object> params, CommonResponse response) throws Exception {
AgentWithdrawLogEntity withdrawLogEntity = agentWithdrawLogMapper.get((long) (double) params.get("id"));
if (withdrawLogEntity.getState() == 0) {
int state = (int) (double) params.get("state");
withdrawLogEntity.setCreator(params.get("creator").toString());
if (state == 3) { // 拒绝返佣金
AgentEntity agentEntity = agentManager.getAgentInfoByPlayerId(withdrawLogEntity.getAgentId());
agentEntity.setTotalCommission(agentEntity.getTotalCommission() + withdrawLogEntity.getMoney());
agentMapper.update(agentEntity);
}
withdrawLogEntity.setState(state - 1);
agentWithdrawLogMapper.updateState(withdrawLogEntity);
} else {
response.setSuccess(false);
response.setErrMsg("该订单已处理");
}
} /**
* 财务明细
*/
@GmHandler(key = "/ttmy/channel/money/list")
public void doChannelMoneyList(Map<String, Object> params, CommonResponse response) throws Exception {
StringBuilder condBuilder = new StringBuilder("where 1=1");
StringBuilder pageBuilder = new StringBuilder(); // 解析数据
int page = JsonMapUtils.parseObject(params, "page", JsonMapUtils.JsonInnerType.TYPE_INT);
int pageSize = JsonMapUtils.parseObject(params, "pageSize", JsonMapUtils.JsonInnerType.TYPE_INT); pageBuilder.append(" LIMIT ").append((page - 1) * pageSize).append(", ").append(pageSize); long channelId = 0;
for (Map.Entry<String, Object> entry : params.entrySet()) {
String key = entry.getKey();
if ("channelId".equals(key)) {
channelId = JsonMapUtils.parseObject(params, "startTime", JsonMapUtils.JsonInnerType.TYPE_LONG);
if (channelId > 0) {
condBuilder.append(" AND log.channel_id >= ").append(channelId);
}
}
}
List<AgentCommissionInfoEntity> commissions = agentCommissionInfoMapper.getList(condBuilder.toString(), pageBuilder.toString());
int totalNum = agentCommissionInfoMapper.getCount(condBuilder.toString()); List<Map<String, Object>> dataList = new ArrayList<>();
for (AgentCommissionInfoEntity commissionInfo : commissions) {
Map<String, Object> data = new HashMap<>();
data.put("playerId", commissionInfo.getPlayerId());
data.put("nickname", commissionInfo.getPlayerName());
data.put("shopName", commissionInfo.getShopName());
data.put("shopMoney", commissionInfo.getMoney());
data.put("channelMoney", commissionInfo.getCommission());
data.put("channelId", commissionInfo.getChannelId());
data.put("createTime", commissionInfo.getCreateTime());
dataList.add(data);
}
Map<String, Object> data = new HashMap<>();
data.put("list", dataList);
data.put("totalNum", totalNum);
if (channelId > 0) {
data.put("dailyNewCount", agentMapper.getDailyChannelPlayerSize(channelId));
data.put("dailyTotalMoney", agentCommissionMapper.getDailyCommissionByAgentId(channelId));
} else {
data.put("dailyNewCount", agentMapper.getDailyTotalChannelPlayerSize());
data.put("dailyTotalMoney", agentCommissionInfoMapper.getDailyTotalCommission());
}
response.setData(data);
} @Autowired
private UserMapper userMapper; @Autowired
private GmChannelAgentUserController gmChannelAgentUserController; /**
* 渠道商用户登录
*/
@GmHandler(key = "/ttmy/channel/user/login")
public void doChannelUserLogin(Map<String, Object> params, CommonResponse response) throws Exception {
String userName = params.get("username").toString();
String password = params.get("password").toString(); System.out.println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");; response.setSuccess(false);
UserEntity userEntity = userMapper.findByUsername(userName);
if (!userEntity.getPassword().equals(password)) {
response.setErrMsg("密码错误");
return;
} if (userEntity.getUserState() != 0) {
response.setErrMsg("您的账号已被冻结,无法登录渠道商后台");
return;
}
AgentEntity agentEntity = agentManager.getAgentInfoByPlayerId(userEntity.getId());
if (agentEntity == null || agentEntity.getAgentLevel() != 1) {
response.setErrMsg("账号类型错误,无法登录");
return;
} Map<String, Object> data = new HashMap<>();
int token = ThreadLocalRandom.current().nextInt(10000000, 100000000);
RedisHelper.set(String.format(gmChannelAgentUserController.channelOnlineKey, userEntity.getId()), Integer.toString(token), 2 * 3600);
data.put("id", userEntity.getId());
data.put("token", Integer.toString(token));
data.put("nickname", userEntity.getNickname());
response.setData(data);
response.setSuccess(true);
}
}

3D捕鱼大富翁源码分析的更多相关文章

  1. PHP扩展编写、PHP扩展调试、VLD源码分析、基于嵌入式Embed SAPI实现opcode查看

    catalogue . 编译PHP源码 . 扩展结构.优缺点 . 使用PHP原生扩展框架wizard ext_skel编写扩展 . 编译安装VLD . Debug调试VLD . VLD源码分析 . 嵌 ...

  2. Go Mobile 例子 basic 源码分析

    OpenGL ES(OpenGL for Embedded Systems)是 OpenGL 三维图形API的子集,针对手机.PDA和游戏主机等嵌入式设备而设计.该API由Khronos集团定义推广, ...

  3. 8、SpringMVC源码分析(3):分析ModelAndView的形成过程

    首先,我们还是从DispatcherServlet.doDispatch(HttpServletRequest request, HttpServletResponse response) throw ...

  4. [转帖]cocos2D-X源码分析之从cocos2D-X学习OpenGL(3)----BATCH_COMMAND

    原贴: cocos2D-X源码分析之从cocos2D-X学习OpenGL(3)----BATCH_COMMAND 上一篇介绍了QUAD_COMMAND渲染命令,顺带介绍了VAO和VBO,这一篇介绍批处 ...

  5. 【OpenCV】SIFT原理与源码分析:关键点描述

    <SIFT原理与源码分析>系列文章索引:http://www.cnblogs.com/tianyalu/p/5467813.html 由前一篇<方向赋值>,为找到的关键点即SI ...

  6. Linq转换操作之OfType,Cast,AsEnumerable,ToLookup源码分析

    Linq转换操作之OfType,Cast,AsEnumerable,ToLookup源码分析 一:Tolookup 1. 从方法的注解上可以看到,ToLookup也是一个k,v的形式,那么问题来了,它 ...

  7. BERT源码分析

    一.整体 整个代码文件如下: 二.tensorflow基础 1.tf.expand_dims 作用:给定张量“ input”,此操作将在“ input”形状的尺寸索引“ axis”处插入尺寸为1的尺寸 ...

  8. [阿里DIEN] 深度兴趣进化网络源码分析 之 Keras版本

    [阿里DIEN] 深度兴趣进化网络源码分析 之 Keras版本 目录 [阿里DIEN] 深度兴趣进化网络源码分析 之 Keras版本 0x00 摘要 0x01 背景 1.1 代码进化 1.2 Deep ...

  9. [心得体会]SpringMVC源码分析

    1. SpringMVC (1) springmvc 是什么? 前端控制器, 主要控制前端请求分配请求任务到service层获取数据后反馈到springmvc的view层进行包装返回给tomcat, ...

  10. 鸿蒙内核源码分析(编译过程篇) | 简单案例窥视GCC编译全过程 | 百篇博客分析OpenHarmony源码| v57.01

    百篇博客系列篇.本篇为: v57.xx 鸿蒙内核源码分析(编译过程篇) | 简单案例窥视编译全过程 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙 ...

随机推荐

  1. dotnet C# 获取当前设备可移动磁盘

    本文告诉大家如何获取当前设备的可移动磁盘 在我的 WPF 应用里面,期望获取到 U 盘的所在盘进行一些有趣的逻辑.可以通过 DriveInfo 类的 GetDrives 获取当前所有的驱动器磁盘 再通 ...

  2. 全网最详细SpringCloud-高级篇

    SpringCloud-高级篇 高级篇包含微服务保护(流量控制,系统保护,熔断降级,服务授权).分布式事务.多级缓存.Redis集群.可靠消息服务 学习安排 技术分类 1.微服务保护 ①初识Senti ...

  3. 解密Prompt系列28. LLM Agent之金融领域摸索:FinMem & FinAgent

    本章介绍金融领域大模型智能体,并梳理金融LLM的相关资源.金融领域的大模型智能体当前集中在个股交易决策这个相对简单的场景,不需要考虑多资产组合的复杂场景.交易决策被简化成市场上各个信息,包括技术面,消 ...

  4. 教你用Perl实现Smgp协议

    本文分享自华为云社区<华为云短信服务教你用Perl实现Smgp协议>,作者:张俭. 引言&协议概述 中国电信短消息网关协议(SMGP)是中国网通为实现短信业务而制定的一种通信协议, ...

  5. sql审计平台部署

    其它数据库管理平台:Orchestrator部署 包链接:https://github.com/hhyo/Archery/tree/master 部署链接:https://github.com/hhy ...

  6. 我们小公司,哪像华为一样,用得上IPD(集成产品开发)?

    在一些咨询或活动现场,我们经常听到有朋友说:我们是小公司,IPD(集成产品开发)太厚重了,不适合我们.但--到底哪里不合适? 提及IPD,成功的案例多以大公司为主:20世纪90年代,IBM在激烈的市场 ...

  7. HTML——input标签

    很多表单元素都是由一个个的 input 元素组成的.它是自闭合标签,根据其 type 属性值的不同分为很多种,例如单行文本框.密码框.单选按钮.复选框.隐藏域.文件上传域.普通按钮.提交按钮以及重置按 ...

  8. 牛逼!50.3K Star!一个自动将屏幕截图转换为代码的开源工具

    1.背景 在当今快节奏的软件开发环境中,设计师与开发者之间的协同工作显得尤为重要.然而,理解并准确实现设计稿的意图常常需要耗费大量的时间和沟通成本.为此,开源社区中出现了一个引人注目的项目--scre ...

  9. Vue3使用Composition API实现响应式

    title: Vue3使用Composition API实现响应式 date: 2024/5/29 下午8:10:24 updated: 2024/5/29 下午8:10:24 categories: ...

  10. 【论文笔记】R-CNN系列之代码实现

    代码源码 前情回顾:[论文笔记]R-CNN系列之论文理解 整体架构 由三部分组成 (1)提取特征的卷积网络extractor (2)输入特征获得建议框rois的rpn网络 (3)传入rois和特征图, ...