当前位置: 首页 > news >正文

Python调用Jumpserver的Api接口增删改查

引言

Jumpserver是一款强大的堡垒机系统,可以有效管理和控制企业内部服务器的访问权限,提高网络安全性。本文将介绍如何使用Python编程语言,结合Jumpserver提供的API接口,实现对跳板机的管理和操作。

1、什么是Jumpserver?

Jumpserver是一种堡垒机系统,它提供了一种安全且集中的方式来管理和控制用户对服务器的访问权限。Jumpserver可以帮助企业实现统一认证、审计日志记录、权限管理等功能,从而提高网络安全性。

2、Jumpserver提供的API接口

Jumpserver提供了一组强大的API接口,可以实现对跳板机的管理和操作。这些API包括获取服务器列表、认证访问权限、执行命令和文件传输等功能,可以通过HTTP请求进行调用。

目前使用的版本:v3.6.2
不同步的版本,API 接口有变化

https://docs.jumpserver.org/zh/v3/dev/rest_api/
在这里插入图片描述

在这里插入图片描述

3、Python中的HTTP请求库

在Python中,我们可以使用第三方的HTTP请求库,如requests库或http.client库,来发送HTTP请求并获取响应。这些库提供了简洁的接口,方便我们与Jumpserver的API进行交互。

requests库:
requests是一个功能强大、简单易用的第三方HTTP请求库,广泛应用于Python开发中。它提供了简洁的API,使得发送HTTP请求变得非常简单。使用requests库,我们可以发送各种类型的HTTP请求(GET、POST、PUT等),设置请求头、请求参数、请求体等,并能够获得服务器响应的状态码、内容等信息。

示例代码:

import requests# 发送GET请求并获取响应
response = requests.get('https://api.example.com/users')# 获取响应内容
content = response.text# 获取响应状态码
status_code = response.status_code

4、使用Python调用Jumpserver API进行认证

在使用Jumpserver的API之前,我们需要先进行认证。通常,Jumpserver会提供一个登录接口,我们可以使用用户名和密码进行登录,并获取到访问令牌(Access Token)。在后续的API请求中,我们需要将该访问令牌作为认证凭证。
https://docs.jumpserver.org/zh/v3/dev/rest_api/#12
在这里插入图片描述
推荐使用:Access Key方式 或者 Private Token
在这里插入图片描述
在这里插入图片描述

docker exec -it jms_core /bin/bash
cd /opt/jumpserver/apps
python manage.py shell
from users.models import User
u = User.objects.get(username='admin')
u.create_private_token()
已经存在 private_token,可以直接获取即可
u.private_token

此处我才用双层验证方式


KeyID = '77e76d19-141c-xxx-8d2b-xxxx'
SecretID = 'a04817bc-0bb1-439f-baa2-xxxx'
gmt_form = '%a, %d %b %Y %H:%M:%S GMT'
ptivate_token = 'xxxxxxxxxx'headers = {'accept': 'application/json','Content-Type': 'application/json',# 'X-CSRFToken': 'eoLo2AVcQK5X1JQ392JHCzjZ8wPCWZJFJao5O9ObH8zQwtiPhGBzaOnNKjaENShf',"Authorization": 'Token ' + ptivate_token,'X-JMS-ORG': '00000000-0000-0000-0000-000000000002','Date': datetime.datetime.utcnow().strftime(gmt_form)
}# 认证
def get_auth(KeyID, SecretID):"""认证:param KeyID:  The key ID:param SecretID:    The secret ID:return:"""signature_headers = ['(request-target)', 'accept', 'date']auth = HTTPSignatureAuth(key_id=KeyID, secret=SecretID, algorithm='hmac-sha256', headers=signature_headers)return authauth = get_auth(KeyID, SecretID)

5、Jumpserver接口自动调用

获取所有用户

# 获取所有用户
def get_user_all():"""获取所有用户:return:"""url = jms_url + '/api/v1/users/users/'response = requests.get(url, auth=auth, headers=headers)user_list = json.loads(response.text)count = 0for i in user_list:count += 1print(i)print(count)

在这里插入图片描述
获取监控指标

# 获取监控指标
def get_prometheus_metric():"""获取监控指标:return:"""url = jms_url + "/api/v1/prometheus/metrics/"response = requests.get(url, headers=headers, auth=auth)print(response.text)return response.text

获取所有资产节点

# 获取所有资产节点
def get_node_all():"""获取所有资产节点:return:"""url = jms_url + "/api/v1/assets/nodes/"response = requests.get(url, headers=headers, auth=auth)node_list = json.loads(response.text)count = 0for i in node_list:count += 1print(i)print(count)return response.json()

查看当前token(即admin)的所有资产

def get_asset_all():"""查看当前token(即admin)的所有资产:return:"""url = jms_url + "/api/v1/assets/assets/"response = requests.get(url, headers=headers, auth=auth)node_list = json.loads(response.text)count = 0for i in node_list:count += 1print(i)print(count)return response.json()

创建资产节点

def assets_nodes_create(node_name):"""创建资产节点:param node_name::return:"""node_data = {"value": node_name}url = jms_url + "/api/v1/assets/nodes/"node_info = get_node_info(node_name)if node_info:  # 根据node_name去查询,如果查到了说明已经有了。print("{name}已存在, id: {id}".format(name=node_name, id=node_info[0]["id"]))else:data = json.dumps(node_data)resp = requests.post(url, headers=headers, data=data)return resp.json()

根据ip获取资产信息

def get_assets_list_by_ip(ip):"""根据ip获取资产信息:param ip::return:"""url = jms_url + "/api/v1/assets/assets/"response = requests.get(url, headers=headers, params={"ip": ip})print(response.json())return response.json()

查看资产节点信息

def get_node_info(node_name):"""查看资产节点信息:param node_name:   节点名称:return:"""url = jms_url + "/api/v1/assets/nodes/"response = requests.get(url, auth=auth, headers=headers, params={"value": node_name})print(response.text)return response.json()

创建资产机器


# 创建资产机器
def asset_create(ip, hostname, node_id, comment):"""创建资产机器:param ip:  ip地址:param hostname:   主机名:param node_id:   节点id:return:    返回创建的资产信息"""asset_Data = {"name": hostname,"address": ip,"platform": "1","protocols": [{"name": "ssh","port": 22}],"is_active": True,"nodes": [node_id],"comment": comment,"accounts": [{# 账号模板id"template": "60b11033-a6e1-467d-8388-68a0e64134ff",}]}url = jms_url + "/api/v1/assets/hosts/"print(url)data = json.dumps(asset_Data)print(data)response = requests.post(url, auth=auth, headers=headers, data=data)print(response.text)

运行创建服务器资产


# 运行创建服务器资产
def run_create_assets(node_name, project_name, ip, comment):"""运行创建服务器资产:param node_name:  节点名称:param project_name:  机器名称:param ip:  ip地址:param comment:  备注:return:"""# 节点id,无节点时创建节点node_info = get_node_info(node_name)# 如果len(node_info) == 0 说明没有节点,需要创建节点if len(node_info) == 0:# 创建节点node_id = assets_nodes_create(node_name)print(node_id)else:# 获取节点idnode_id = node_info[0]["id"]print(node_id)# 管理用户 idhostname = "{ip}_{project_name}".format(ip=ip, project_name=project_name)# 查IP,创建资产ip_info = get_assets_list_by_ip(ip)if ip_info:print("%s 已存在,nodes: %s" % (ip_info[0]["address"], ip_info[0]["nodes"]))else:asset_create(ip, hostname, node_id, comment)

获取组织信息


def get_org_info():"""获取组织信息:return:"""url = jms_url + "/api/v1/orgs/orgs/"response = requests.get(url, headers=headers)org_list = response.textprint(org_list)for i in org_list.split("id"):print(i)return response.json()

6、完整代码

# -*- coding: utf-8 -*-
# @Time    : 2023/8/29 14:21
# @Author  : 南宫乘风
# @Email   : 1794748404@qq.com
# @File    : jms_add.py
# @Software: PyCharmimport requests, datetime, json
from httpsig.requests_auth import HTTPSignatureAuthKeyID = '77e76d19-141c-4545--xxx'
SecretID = 'a04817bc-0bb1-439f-baa2-xxxx'
gmt_form = '%a, %d %b %Y %H:%M:%S GMT'
ptivate_token = 'xxxxx'headers = {'accept': 'application/json','Content-Type': 'application/json',# 'X-CSRFToken': 'eoLo2AVcQK5X1JQ392JHCzjZ8wPCWZJFJao5O9ObH8zQwtiPhGBzaOnNKjaENShf',"Authorization": 'Token ' + ptivate_token,'X-JMS-ORG': '00000000-0000-0000-0000-000000000002','Date': datetime.datetime.utcnow().strftime(gmt_form)
}# 认证
def get_auth(KeyID, SecretID):"""认证:param KeyID:  The key ID:param SecretID:    The secret ID:return:"""signature_headers = ['(request-target)', 'accept', 'date']auth = HTTPSignatureAuth(key_id=KeyID, secret=SecretID, algorithm='hmac-sha256', headers=signature_headers)return authauth = get_auth(KeyID, SecretID)# 获取所有用户
def get_user_all():"""获取所有用户:return:"""url = jms_url + '/api/v1/users/users/'response = requests.get(url, auth=auth, headers=headers)user_list = json.loads(response.text)count = 0for i in user_list:count += 1print(i)print(count)# 获取监控指标
def get_prometheus_metric():"""获取监控指标:return:"""url = jms_url + "/api/v1/prometheus/metrics/"response = requests.get(url, headers=headers, auth=auth)print(response.text)return response.text# 获取所有资产节点
def get_node_all():"""获取所有资产节点:return:"""url = jms_url + "/api/v1/assets/nodes/"response = requests.get(url, headers=headers, auth=auth)node_list = json.loads(response.text)count = 0for i in node_list:count += 1print(i)print(count)return response.json()# 查看当前token(即admin)的所有资产
def get_asset_all():"""查看当前token(即admin)的所有资产:return:"""url = jms_url + "/api/v1/assets/assets/"response = requests.get(url, headers=headers, auth=auth)node_list = json.loads(response.text)count = 0for i in node_list:count += 1print(i)print(count)return response.json()###################################################################################################
# 创建资产节点
def assets_nodes_create(node_name):"""创建资产节点:param node_name::return:"""node_data = {"value": node_name}url = jms_url + "/api/v1/assets/nodes/"node_info = get_node_info(node_name)if node_info:  # 根据node_name去查询,如果查到了说明已经有了。print("{name}已存在, id: {id}".format(name=node_name, id=node_info[0]["id"]))else:data = json.dumps(node_data)resp = requests.post(url, headers=headers, data=data)return resp.json()#
def get_assets_list_by_ip(ip):"""根据ip获取资产信息:param ip::return:"""url = jms_url + "/api/v1/assets/assets/"response = requests.get(url, headers=headers, params={"ip": ip})print(response.json())return response.json()# 查看资产节点信息
def get_node_info(node_name):"""查看资产节点信息:param node_name:   节点名称:return:"""url = jms_url + "/api/v1/assets/nodes/"response = requests.get(url, auth=auth, headers=headers, params={"value": node_name})print(response.text)return response.json()# 创建资产机器
def asset_create(ip, hostname, node_id, comment):"""创建资产机器:param ip:  ip地址:param hostname:   主机名:param node_id:   节点id:return:    返回创建的资产信息"""asset_Data = {"name": hostname,"address": ip,"platform": "1","protocols": [{"name": "ssh","port": 22}],"is_active": True,"nodes": [node_id],"comment": comment,"accounts": [{# 账号模板id"template": "60b11033-a6e1-467d-8388-68a0e64134ff",}]}url = jms_url + "/api/v1/assets/hosts/"print(url)data = json.dumps(asset_Data)print(data)response = requests.post(url, auth=auth, headers=headers, data=data)print(response.text)# 运行创建服务器资产
def run_create_assets(node_name, project_name, ip, comment):"""运行创建服务器资产:param node_name:  节点名称:param project_name:  机器名称:param ip:  ip地址:param comment:  备注:return:"""# 节点id,无节点时创建节点node_info = get_node_info(node_name)# 如果len(node_info) == 0 说明没有节点,需要创建节点if len(node_info) == 0:# 创建节点node_id = assets_nodes_create(node_name)print(node_id)else:# 获取节点idnode_id = node_info[0]["id"]print(node_id)# 管理用户 idhostname = "{ip}_{project_name}".format(ip=ip, project_name=project_name)# 查IP,创建资产ip_info = get_assets_list_by_ip(ip)if ip_info:print("%s 已存在,nodes: %s" % (ip_info[0]["address"], ip_info[0]["nodes"]))else:asset_create(ip, hostname, node_id, comment)def get_org_info():"""获取组织信息:return:"""url = jms_url + "/api/v1/orgs/orgs/"response = requests.get(url, headers=headers)org_list = response.textprint(org_list)for i in org_list.split("id"):print(i)return response.json()if __name__ == '__main__':jms_url = 'https://jms.xxx.top'username = 'admin'password = 'xxxxxx'# 获取token# token = get_token(jms_url, username, password)# 创建资产节点# assets_nodes_create("k8s")# 根据ip获取资产信息# get_assets_list_by_ip("192.168.11.10")# 查看资产节点信息# get_node_info("k8s")# 创建资产调用# node_id = ["e8641c37-93e3-450e-aaf8-64d5baa69753"]# get_node_info("k8s")# asset_create(ip, hostname, node_id)# 运行创建服务器资产# run_create_assets("test", "风控", "192.168.11.10", "测试")# 获取组织信息# get_org_info()# 获取所有用户get_user_all()

在这里插入图片描述

相关文章:

Python调用Jumpserver的Api接口增删改查

引言 Jumpserver是一款强大的堡垒机系统,可以有效管理和控制企业内部服务器的访问权限,提高网络安全性。本文将介绍如何使用Python编程语言,结合Jumpserver提供的API接口,实现对跳板机的管理和操作。 1、什么是Jumpserver&#…...

后端入门教程:从零开始学习后端开发

1. 编程基础 首先,作为一名后端开发者,你需要掌握至少一门编程语言。Python是一个很好的选择,因为它易于学习且功能强大。让我们从一个简单的示例开始,在控制台输出 "Hello, World!"。 2. 学习Web基础 了解Web开发基…...

无涯教程-JavaScript - DB函数

描述 DB函数使用固定余额递减法返回指定期间内资产的折旧。 语法 DB (cost, salvage, life, period, [month])争论 Argument描述Required/OptionalCostThe initial cost of the asset.RequiredSalvageThe value at the end of the depreciation (sometimes called the salv…...

2023年财务顾问行业研究报告

第一章 行业概况 1.1 定义及分类 财务顾问(Financial Advisor,FA)也被称为融资顾问,主要为创业公司提供投资和融资的专业服务。他们在创业者和投资者之间扮演着至关重要的中介角色,为双方搭建桥梁,确保投…...

2023SICTF ROUND2 baby_heap

附件:baby_heap libc版本:glibc2.23 思路一:通过house of orange泄露libc地址,然后通过unsorted bin attack将main_arena88地址写入到chunk_ptr(也就是申请出来的堆数组)中,这时候unsorted bi…...

buuctf crypto 【密码学的心声】解题记录

1.打开可以看到一个曲谱 2.看到曲谱中的提示埃塞克码可以想到ascii码,没有八可以联想到八进制,而八进制又对应着三位的二进制,然后写个脚本就好了 oct [111,114,157,166,145,123,145,143,165,162,151,164,171,126,145,162,171,115,165,143,…...

论文阅读 (100):Simple Black-box Adversarial Attacks (2019ICML)

文章目录 1 概述1.1 要点1.2 代码1.3 引用 2 背景2.1 目标与非目标攻击2.2 最小化损失2.3 白盒威胁模型2.4 黑盒威胁模型 3 简单黑盒攻击3.1 算法3.2 Cartesian基3.3 离散余弦基3.4 一般基3.5 学习率 ϵ \epsilon ϵ3.6 预算 1 概述 1.1 要点 题目:简单黑盒对抗攻…...

41 个下载免费 3D 模型的最佳网站

推荐:使用 NSDT场景编辑器 快速搭建3D应用场景 1. Pikbest Pikbest是一个设计资源平台,提供超过3万件创意艺术品。您可以在Pikbest上找到设计模板,演示幻灯片,视频和音乐等。您可以找到不同的3D模型,例如婚礼装饰&…...

SpringMVC之JSR303和拦截器

认识JSR303 JSR303是一项Java标准规范,也叫做Bean Validation规范,提供了一种JavaBean数据验证的规范方式。在SpringMVC中,可以通过引入JSR303相关的依赖,来实现数据的校验。 在使用JSR303进行校验时,需要在需要校验的…...

通过rabbitmq生成延时消息,并生成rabbitmq镜像

通过rabbitmq生成延时消息队列,并生成rabbitmq镜像 整体描述1. 使用场景2. 目前问题3. 前期准备 具体步骤1. 拉取镜像2. 运行镜像3. 安装插件4. 代码支持4.1 config文件4.2 消费监听4.2 消息生产 5. 功能测试 镜像操作1. 镜像制作2. 镜像导入 总结 整体描述 1. 使用…...

结构型模式-外观模式

隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。 这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系…...

vue三个点…运算符时报错 Syntax Error: Unexpected token

出现以下问题报错: 解决: 在项目根目录新建一个名为.babelrc的文件 {"presets": ["stage-2"] }...

C# wpf 实现桌面放大镜

文章目录 前言一、如何实现?1、制作无边框窗口2、Viewbox放大3、截屏显示(1)、截屏(2)、转BitmapSource(3)、显示 4、定时截屏 二、完整代码三、效果预览总结 前言 做桌面截屏功能时需要放大镜…...

Mybatis中的#{}和${}的区别

#{}和${}他们两都是替换参数的作用,但也还是有很大区别的。 目录 一、${} 二、#{} 三、注意点 一、${} 它是直接替换过来,不添加其它的什么。 比如下面的sql语句 select *from user where id${id} 如果id1,那么他替换过来就还是1&#xff…...

选择(使用)数据库

MySQL从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129334507?spm1001.2014.3001.5502 语法格式: use 数据库名称;大家应该知道,在对数据库进行操作的时候,要制定数据库的操作对象,也就是说操作哪一个数据库 案列:选择testing数据库 …...

GFS分布式文件系统

1、GlusterFS简介 GlusterFS(GFS)是一个开源的分布式文件系统 由存储服务器、客户端以及NFS/Samba 存储网关(可选,根据需要选择使用)组成。MFS 传统的分布式文件系统大多通过元服务器来存储元数据,元数据…...

虚函数、纯虚函数、多态

一.虚函数 在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据所指对象的实际类型来调用相应的函数,如果对象类型是派生类,就调用派生类的函数,如果对象类型是基类,就调用基类的函数。 …...

QGIS学习3 - 安装与管理插件

QGIS安装与管理插件主要是使用了菜单栏安装与管理插件这个菜单。 1、通过压缩文件等添加非官方插件 通过压缩文件添加有可能会提示存在安全问题等,直接点是即可。 之后点击install plugins即可完成。安装后导入插件 但是load失败了应该是安装没有成功。只能通过u…...

LeetCode377. 组合总和 Ⅳ

377. 组合总和 Ⅳ 文章目录 [377. 组合总和 Ⅳ](https://leetcode.cn/problems/combination-sum-iv/)一、题目二、题解方法一:完全背包一维数组动态规划思路代码分析 方法二:动态规划二维数组 一、题目 给你一个由 不同 整数组成的数组 nums &#xff0…...

QT将数据写入文件,日志记录

项目场景: 在QT应用中,有时候需要将错误信息记录在log文件里面,或者需要将数据输出到文件中进行比对查看使用。 创建log文件,如果文件存在则不创建 QDir dir(QCoreApplication::applicationDirPath()"/recv_data");if(…...

vue2与vue3的使用区别与组件通信

1. 脚手架创建项目的区别&#xff1a; vue2: vue init webpack “项目名称”vue3: vue create “项目名称” 或者vue3一般与vite结合使用: npm create vitelatest yarn create vite2. template中结构 vue2: template下只有一个元素节点 <template><div><div…...

亚信科技与中国信通院达成全方位、跨领域战略合作

9月11日&#xff0c;亚信科技&#xff08;中国&#xff09;有限公司「简称&#xff1a;亚信科技」与中国信息通信研究院「简称&#xff1a;中国信通院」在京达成战略合作&#xff0c;双方将在关键技术研发、产业链协同等方面展开全方位、跨领域、跨行业深度合作&#xff0c;共促…...

华为Linux系统开发工程师面试

在Linux系统开发工程师的面试中&#xff0c;你可能会遇到以下一些问题&#xff1a; 在同一个网站中&#xff0c;当客户访问的时候&#xff0c;会出现有的页面访问的速度快而有的慢&#xff0c;系统和服务完全正常、网络带宽正常&#xff0c;你如何诊断这个问题&#xff1f;你以…...

Qt利用QTime实现sleep效果分时调用串口下发报文解决串口下发给下位机后产生的粘包问题

Qt利用QTime实现sleep效果分时调用串口下发报文解决串口下发给下位机后产生的粘包问题 文章目录 Qt利用QTime实现sleep效果分时调用串口下发报文解决串口下发给下位机后产生的粘包问题现象解决方法 现象 当有多包数据需要连续下发给下位机时&#xff0c;比如下载数据等&#x…...

人工智能:神经细胞模型到神经网络模型

人工智能领域中的重要流派之一是&#xff1a;从神经细胞模型&#xff08;Neural Cell Model&#xff09;到神经网络模型&#xff08;Neural Network Model&#xff09;。 一、神经细胞模型 第一个人工神经细胞模型是“MP”模型&#xff0c;它是由麦卡洛克、匹茨合作&#xff0…...

Redisson分布式锁实战

实战来源 此问题基于电商 这周遇见这么一个问题&#xff0c;简略的说一下 由MQ发布了两个消息&#xff0c;一个是订单新增&#xff0c;一个是订单状态变更 由于直接付款之后&#xff0c;这两个消息的发布时间不分先后&#xff0c;可能会造成两种情况&#xff0c;1、订单状态变更…...

JavaScript中循环遍历数组、跳出循环和继续循环

循环遍历数组 上个文章我们简单的介绍for循环&#xff0c;接下来&#xff0c;我们使用for循环去读取数据的数据&#xff0c;之前我们写过这样的一个数组&#xff0c;如下&#xff1a; const ITshareArray ["张三","二愣子","2033-1997","…...

Java——》Synchronized和Lock区别

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…...

JDK20 + SpringBoot 3.1.0 + JdbcTemplate 使用

JDK20 SpringBoot 3.1.0 JdbcTemplate 使用 一.测试数据库 Postgres二.SpringBoot项目1.Pom 依赖2.配置文件3.启动类4.数据源配置类5.实体对象类包装类6.测试用实体对象1.基类2.扩展类 7.测试类 通过 JdbcTemplate 直接执行 SQL 语句&#xff0c;结合源码动态编译即可方便实现…...

CTFhub_SSRF靶场教程

CTFhub SSRF 题目 1. Bypass 1.1 URL Bypass 请求的URL中必须包含http://notfound.ctfhub.com&#xff0c;来尝试利用URL的一些特殊地方绕过这个限制吧 1.利用?绕过限制urlhttps://www.baidu.com?www.xxxx.me 2.利用绕过限制urlhttps://www.baidu.comwww.xxxx.me 3.利用斜…...

越南人一般去哪个网站做贸易/谷歌seo一个月费用需要2万吗

写这个简单的正则匹配呢&#xff0c;主要是让大家可以参考取自己文本中想要的东西&#xff0c;比如我现在的文本内容是这样的 我想要把<Sentiment>和</Sentiment>之间的neg和pos提取出来&#xff0c;文件基本操作参考上一篇python中使用文件的读取和简单正则使用&a…...

深圳定制建设网站/推广软件赚钱的平台

前言过年也没完全闲着&#xff0c;每天用一点点时间学点东西&#xff0c;本文为大家介绍几个python操作的细节&#xff0c;包含all、any、for in等操作&#xff0c;以及介绍我解决问题的思路。一、开篇先从我看到的一个简单的语句开始。刚看到这个语句的时候我整个人完全懵住了…...

自己做的网站怎么爬数据库/crm软件

引言&#xff1a; Dos.Common是一个开发中的常用类库&#xff0c;如HttpHelper、LogHelper、CacheHelper、CookieHelper、MapperHelper等等。与Dos.WeChat、Dos.CMS等集成。官方网站&#xff1a;http://ITdos.com/Dos/Common/Index.html 开源中国&#xff1a;http://www.oschin…...

wordpress wp-content权限/百度指数使用指南

1.题目详情 给定一个循环数组&#xff08;最后一个元素的下一个元素是数组的第一个元素&#xff09;&#xff0c;输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序&#xff0c;这个数字之后的第一个比它更大的数&#xff0c;这意味着你应该循环地搜索…...

创新网站建设工作室/什么叫网络市场营销

html head添加&#xff1a; <link rel"shortcut icon" href"picture//timg.jpg">转载于:https://www.cnblogs.com/q2546/p/10980872.html...

.com免费网站怎么做/宁波网站排名优化seo

2019独角兽企业重金招聘Python工程师标准>>> 区块链金融实际上是区块链技术在金融领域的应用。区块链是一种基于比特币的技术&#xff0c;本质上是一种分散的信任机制。通过共享集体维护分布式节点交换中可持续增长的数据库&#xff0c;实现信息的安全性和准确性。区…...