Go-Ldap-Admin | openLDAP 同步钉钉、企业微信、飞书组织架构实践和部分小坑
目录
一、Docker-compose快速拉起demo测试环境
二、原生部署流程
安装MySQL:5.7数据库
安装openLDAP
修改域名,新增con.ldif
创建一个组织
安装OpenResty
下载后端
下载前端
部署后端
部署前端
三、管理动态字段
钉钉
企业微信
飞书
四、部分报错
Go-Ldap-Admin官网:Go-Ldap-Admin
本文用于记录整个安装部署过程以及过程中遇到的坑。
首先准备一台干净的服务器,配置最好不低于2C4G,当然如果MySQL不在本机部署,那可以将配置降为1C2G。(CentOS7)我也不喜欢用这玩意儿,但是官网是按照这个来的。
一、Docker-compose快速拉起demo测试环境
仅仅是一个测试用的demo环境!不支持IM以进行数据同步。
docker和docker-compose默认你有,端口映射情况:
Service | Port(宿主机端口:容器端口) |
MySQL | 3307:3306 |
openLDAP | 389:389 |
phpldapadmin | 8091:80 |
go-ldap-admin | 8090:80 ,8888:8888 |
拉取:
git clone https://github.com/eryajf/go-ldap-admin.git
进入到docker-compose目录之后,目录层级与内容如下:
tree -N docker-compose
docker-compose
├── config
│ ├── init.ldif
│ └── my.cnf
└── docker-compose.yaml1 directory, 3 files
拉起:
cd docs/docker-compose
docker-compose up -d
当看到容器都正常运行之后,可以在本地进行访问:http://localhost:8090,用户名/密码:admin/123456
如果想要访问PhpLdapAdmin,则可访问:http://localhost:8091,用户名/密码:cn=admin,dc=eryajf,dc=net/123456
注意:这里有个小坑,在此测试环境中是无法进行钉钉等应用架构同步的,报错如下:
41001: access_token missing, hint: [1681804729372880375054761], from ip: *, more info at https://open.work.weixin.qq.com/devtool/query?e=41001
直到看见作者在GitHub的评论才知道是不支持。
二、原生部署流程
随手关一下:
systemctl disable firewalld.service --now
安装MySQL:5.7数据库
俺也没试过8.0,官网建议使用5.7。
由于CentOS的yum源中没有mysql,需要到mysql的官网下载yum repo配置文件:
wget https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm
然后进行repo的安装:
rpm -ivh mysql80-community-release-el7-5.noarch.rpm
根据自己的需要,关闭,或者开启想要的版本:
# 关闭8.0
yum-config-manager --disable mysql80-community# 开启5.7
yum-config-manager --enable mysql57-community
开始安装:
yum install mysql-server -y
Mysql,启动!
systemctl start mysqld
第一次登录查看临时密码:
grep 'temporary password' /var/log/mysqld.log
登录后对密码进行修改:
alter user 'root'@'localhost' identified by 'Abc@1234';
随手执行一下:
use mysql;
update user set host = '%' where user ='root';
创建数据库:
CREATE USER 'ldap'@'localhost' IDENTIFIED BY 'Eryajf@123';CREATE DATABASE IF NOT EXISTS `go_ldap_admin` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;GRANT ALL PRIVILEGES on `go_ldap_admin`.* to 'ldap'@'localhost';FLUSH privileges;
安装openLDAP
以yum方式安装:
yum install openldap openldap-clients openldap-servers -y
复制一个默认配置到指定目录下,并授权,这一步一定要做,然后再启动服务,不然生产密码时会报错:
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
授权:
chown -R ldap /var/lib/ldap/DB_CONFIG
启动:
systemctl enable slapd --now
初始化配置,生成密码,这里自己的记录一下{SSHA}这一串,后面需要用到:
slappasswd -s 123456
新增修改密码文件,ldif为后缀,文件名随意,不要在/etc/openldap/slapd.d/目录下创建类似文件 生成的文件为需要通过命令去动态修改ldap现有配置,如下,我在家目录下,创建文件(记得修改{SSHA}密码为上面拿到的那一串):
cd ~
vim changepwd.ldif
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}LSgYPTUW4zjGtIVtuZ8cRUqqFRv1tWpE# 这里解释一下这个文件的内容:
# 第一行执行配置文件,这里就表示指定为 cn=config/olcDatabase={0}config 文件。
# 你到/etc/openldap/slapd.d/目录下就能找到此文件
# 第二行 changetype 指定类型为修改
# 第三行 add 表示添加 olcRootPW 配置项
# 第四行指定 olcRootPW 配置项的值
# 在执行下面的命令前,你可以先查看原本的olcDatabase={0}config文件,
# 里面是没有olcRootPW这个项的,执行命令后,你再看就会新增了olcRootPW项,
# 而且内容是我们文件中指定的值加密后的字符串
执行命令以修改配置:
ldapadd -Y EXTERNAL -H ldapi:/// -f changepwd.ldif
切记不能直接修改/etc/openldap/slapd.d/目录下的配置。
我们需要向 LDAP 中导入一些基本的 Schema。这些 Schema 文件位于/etc/openldap/schema/
目录中,schema控制着条目拥有哪些对象类和属性,可以自行选择需要的进行导入(注意依次执行):
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/collective.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/corba.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/duaconf.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/dyngroup.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/java.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/misc.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/openldap.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/pmi.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/ppolicy.ldif
修改域名,新增con.ldif
这里官方自定义的域名为 eryajf.net,管理员用户账号为admin。 如果要修改,则修改文件中相应的dc=eryajf,dc=net为自己的域名,密码切记改成上面重新生成的哪个。
vim con.ldif
dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read by dn.base="cn=admin,dc=eryajf,dc=net" read by * nonedn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=eryajf,dc=netdn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,dc=eryajf,dc=netdn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}LSgYPTUW4zjGtIVtuZ8cRUqqFRv1tWpEdn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=eryajf,dc=net" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=admin,dc=eryajf,dc=net" write by * read
执行命令以修改:
ldapmodify -Y EXTERNAL -H ldapi:/// -f con.ldif
确认这里有5条输出,因为进行了5项修改:
启用memberof功能,新增add-memberof.ldif:
vim add-memberof.ldif
dn: cn=module{0},cn=config
cn: modulle{0}
objectClass: olcModuleList
objectclass: top
olcModuleload: memberof.la
olcModulePath: /usr/lib64/openldapdn: olcOverlay={0}memberof,olcDatabase={2}hdb,cn=config
objectClass: olcConfig
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: top
olcOverlay: memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfUniqueNames
olcMemberOfMemberAD: uniqueMember
olcMemberOfMemberOfAD: memberOf
新增refint1.ldif文件:
vim refint1.ldif
dn: cn=module{0},cn=config
add: olcmoduleload
olcmoduleload: refint
新增refint2.ldif文件:
vim refint2.ldif
dn: olcOverlay=refint,olcDatabase={2}hdb,cn=config
objectClass: olcConfig
objectClass: olcOverlayConfig
objectClass: olcRefintConfig
objectClass: top
olcOverlay: refint
olcRefintAttribute: memberof uniqueMember manager owner
依次执行以下命令,顺序不要错:
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f add-memberof.ldif
ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f refint1.ldif
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f refint2.ldif
创建一个组织
到此,配置修改完了,在上述基础上,我们来创建一个叫做 eryajf company 的组织(官网叫这个,根据需求,自行修改),并在其下创建一个 admin 的组织角色(该组织角色内的用户具有管理整个 LDAP 的权限)和 一些初始化必须的组织:
vim base.ldif
dn: dc=eryajf,dc=net
objectClass: top
objectClass: dcObject
objectClass: organization
o: Eryajf Company
dc: eryajfdn: cn=admin,dc=eryajf,dc=net
objectClass: organizationalRole
cn: admindn: ou=people,dc=eryajf,dc=net
ou: people
description: 用户根目录
objectClass: organizationalUnitdn: ou=dingtalkroot,dc=eryajf,dc=net
ou: dingtalkroot
description: 钉钉根部门
objectClass: top
objectClass: organizationalUnitdn: ou=wecomroot,dc=eryajf,dc=net
ou: wecomroot
description: 企业微信根部门
objectClass: top
objectClass: organizationalUnitdn: ou=feishuroot,dc=eryajf,dc=net
ou: feishuroot
description: 飞书根部门
objectClass: top
objectClass: organizationalUnit
执行命令,添加配置, 这里要注意修改域名为自己配置的域名,然后需要输入上面我们生成的密码123456:
ldapadd -x -D cn=admin,dc=yaobili,dc=com -W -f base.ldif
安装OpenResty
配置阿里和openresty的yum源:
yum -y install yum-utils
yum-config-manager --add-repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
安装:
yum install openresty -y
创建一些软链,便于维护或者规范:
ln -snf /usr/local/openresty/nginx/sbin/nginx /usr/sbin/nginx
ln -snf /usr/local/openresty/nginx/conf /etc/nginx
启动服务:
systemctl enable openresty --now
下载后端
官网上给的下载版本是0.5.9,但是我强烈建议安装0.5.10:
wget https://github.com/eryajf/go-ldap-admin/releases/download/v0.5.10/go-ldap-admin-v0.5.10-linux-amd64.tar.gz
mkdir go-ldap-admin && tar xf go-ldap-admin-v0.5.10-linux-amd64.tar.gz -C go-ldap-admin
下载前端
wget https://github.com/eryajf/go-ldap-admin-ui/releases/download/v0.5.13/go-ldap-admin-ui-v0.5.13.tar.gz
tar xf go-ldap-admin-ui-v0.5.13.tar.gz
部署后端
mkdir -p /data/www && mv go-ldap-admin /data/www
根据实际情况进行修改:
vim /data/www/go-ldap-admin/config.yml
应用相关信息获取查看这里:
钉钉:配置钉钉同步 | Go-Ldap-Admin
企业微信:配置企业微信同步 | Go-Ldap-Admin
飞书:配置飞书同步 | Go-Ldap-Admin
添加系统服务:
vim /usr/lib/systemd/system/go-ldap-admin.service
[Unit]
Description=Go Ldap Admin Service[Service]
WorkingDirectory=/data/www/go-ldap-admin/
ExecStart=/data/www/go-ldap-admin/go-ldap-admin[Install]
WantedBy=multi-user.target
启动:
systemctl daemon-reload && systemctl start go-ldap-admin
部署前端
移动制品:
mv go-ldap-admin-ui /data/www//demo-go-ldap-admin.eryajf.net
在OpenResty中添加如下配置,代理本项目:
mkdir /etc/nginx/conf && vim /etc/nginx/conf/nginx.conf
server {listen 80;server_name demo-go-ldap-admin.eryajf.net;root /data/www//demo-go-ldap-admin.eryajf.net/dist;location / {try_files $uri $uri/ /index.html;add_header Cache-Control 'no-store';}location /api/ {proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;proxy_pass http://127.0.0.1:8888;}
}
记得自己去 include 一下配置文件,默认你懂。
nginx -t
nginx -s reload
确保一下服务都起来了:
systemctl status mysqld
systemctl status slapd
systemctl status go-ldap-admin
systemctl status openresty
都启动之后,就可以打开web管理页面
http:ip:端口
http://你的IP/phpldapadmin#/dashboard
默认用户名:admin,默认密码是LDAP设置的密码123456。
三、管理动态字段
在进行同步之前需要先去先建立字段映射:
下面有图片示例。
钉钉
创建分组的动态关系:
{"flag": "dingtalk_group", // 字段标识"attributes": { // 字段属性"groupName":"custom_name_pinyin", // 分组名称(通常为分组名的拼音)"remark":"name", // 分组描述"sourceDeptId":"id", // 部门ID"sourceDeptParentId":"parentid" // 父部门ID}
}
创建用户的动态关系:
{"flag": "dingtalk_user", // 字段标识"attributes": { // 字段属性"username":"custom_name_pinyin", // 用户名(通常为用户名拼音)"nickname":"name", // 中文名字"givenName":"name", // 花名"mail":"email", // 邮箱"jobNumber":"job_number", // 工号"mobile":"mobile", // 手机号"avatar":"avatar", // 头像"postalAddress":"work_place", // 地址"position":"title", // 职位"introduction":"remark", // 说明"sourceUserId":"userid", // 源用户ID"sourceUnionId":"unionid" // 源用户唯一ID}
}
企业微信
创建分组的动态关系:
{"flag": "wecom_group","attributes": {"groupName":"custom_name_pinyin","remark":"name","sourceDeptId":"id","sourceDeptParentId":"parentid"}
}
创建用户的动态关系:
{"flag": "wecom_user","attributes": {"username":"custom_name_pinyin","nickname":"name","givenName":"alias","mail":"email","jobNumber":"mobile","mobile":"mobile","avatar":"avatar","postalAddress":"address","position":"external_position","introduction":"name","sourceUserId":"userid","sourceUnionId":"userid"}
}
飞书
创建分组的动态关系:
{"flag": "feishu_group","attributes": {"groupName":"department_id","remark":"name","sourceDeptId":"open_department_id","sourceDeptParentId":"parent_department_id"}
}
创建用户的动态关系:
{"flag": "feishu_user","attributes": {"username":"custom_name_pinyin","nickname":"name","givenName":"name","mail":"email","jobNumber":"employee_no","mobile":"mobile","avatar":"avatar","postalAddress":"work_station","position":"job_title","introduction":"name","sourceUserId":"user_id","sourceUnionId":"union_id"}
}
以企业微信举例,就这样填进去即可:
然后去同步吧~但是需要注意!!!!!!
先同步分组,再同步用户!!!!!
四、部分报错
errcode“:41001,“errmsg“:“access_token missing rid:
若你使用的是docker-compose直接拉起的,前面也提到了那对不起,demo版本不支持IM认证。若不是,则是你的自建应用没有设置ip白名单(拿企业微信举例,没错就算你不设置,他也不会让所有ip都正常访问)。
访问:企业微信
找到你的自建应用并到这里配置:
LDAP Result Code 68 "Entry Already Exists"
说明ou已经存在
This base cannot be created with PLA.
此根不能创建ou。找个干净的目录新建文件:base.ldif
vim base.ldif
dn: dc=改成你的,dc=改成你的
o: ldapit
objectclass: dcObject
objectclass: organization
执行,记得修改内容:
ldapadd -f base.ldif -x -D cn=admin,dc=改成你的,dc=改成你的 -W
ldap_add: Invalid syntax (21)
additional info: objectclass: value #0 invalid per syntax
配置文件格式或内容存在错误
record not found
若你使用的是本文中的最新版本,则问题在于你的字段填写,请检查字段映射是否正确。若你使用的是官网中的安装版本,建议替换到最新版本进行安装。
相关文章:
Go-Ldap-Admin | openLDAP 同步钉钉、企业微信、飞书组织架构实践和部分小坑
目录 一、Docker-compose快速拉起demo测试环境 二、原生部署流程 安装MySQL:5.7数据库 安装openLDAP 修改域名,新增con.ldif 创建一个组织 安装OpenResty 下载后端 下载前端 部署后端 部署前端 三、管理动态字段 钉钉 企业微信 飞书 四、…...
elasticsearch+logstash+kibana整合(ELK的使用)第一课
一、安装elasticsearch 0、创建目录,统一放到/data/service/elk 1、下载安装包 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.1.0-linux-x86_64.tar.gz2、解压 tar -xzvf elasticsearch-7.1.0-linux-x86_64.tar.gz3、新建用户和组…...
宝塔 php修改了php.ini配置不生效
最近在使用hypref,php的版本是7.4 服务器linux,用宝塔安装完php,并装完swoole插件后 安装了swoole后,需要在php.ini中修改一下配置文件 添加 swoole.use_shortnameOff 但是添加了,重启php,依然不生效 解决方法是: 同时…...
Unrecognized option ‘stream_loop‘.(版本不匹配,利用make编译安装)
执行如下命令: ffmpeg -re -stream_loop -1 -i 1.mp4 -vcodec copy -acodec copy -f rtsp -rtsp_transport tcp rtsp://localhost:8554/live1.sdp报如下错误:Unrecognized option ‘stream_loop’. 查看ffmpeg版本:ffmpeg -version 显示&am…...
【考研数学】概率论与数理统计 —— 第三章 | 二维随机变量及其分布(2,常见的二维随机变量及二维变量的条件分布和独立性)
文章目录 引言四、常见的二维随机变量4.1 二维均匀分布4.2 二维正态分布 五、二维随机变量的条件分布5.1 二维离散型随机变量的条件分布律5.2 二维连续型随机变量的条件分布 六、随机变量的独立性6.1 基本概念6.2 随机变量独立的等价条件 写在最后 引言 有了上文关于二维随机变…...
力扣 -- 10. 正则表达式匹配
解题步骤: 参考代码: class Solution { public:bool isMatch(string s, string p) {int ms.size();int np.size();//处理后续映射关系s s;//处理后续映射关系p p;vector<vector<bool>> dp(m1,vector<bool>(n1));//初始化dp[0][0]true…...
Spring源码分析(四) Aop全流程
一、Spring AOP基础概念 1、基础概念 连接点(Join point):能够被拦截的地方,Spring AOP 是基于动态代理的,所以是方法拦截的,每个成员方法都可以称之为连接点;切点(Poincut):每个方法都可以称之为连接点&…...
定义现代化实时数据仓库,SelectDB 全新产品形态全面发布
导读:9 月 25 日,2023 飞轮科技产品发布会在线上正式召开,本次产品发布会以 “新内核、新图景” 为主题,飞轮科技 CEO 马如悦全面解析了现代化数据仓库的演进趋势,宣布立足于多云之上的 SelectDB Cloud 云服务全面开放…...
Linux系统编程(七):线程同步
参考引用 UNIX 环境高级编程 (第3版)黑马程序员-Linux 系统编程 1. 同步概念 所谓同步,即同时起步、协调一致。不同的对象,对 “同步” 的理解方式略有不同 设备同步,是指在两个设备之间规定一个共同的时间参考数据库同步,是指让…...
Arcgis克里金插值报错:ERROR 999999: 执行函数时出错。 表名无效。 空间参考不存在。 ERROR 010429: GRID IO 中存在错误
ERROR 999999: 执行函数时出错。 问题描述 表名无效。 空间参考不存在。 ERROR 010429: GRID IO 中存在错误: WindowSetLyr: Window cell size does not match layer cell size. name: c:\users\lenovo\appdata\local\temp\arc2f89\t_t164, adepth: 32, type: 1, iomode: 6, …...
【网络协议】ARP协议
为什么网络需要同时借助MAC地址这种物理地址和IP地址这种逻辑地址进行通信? 尽管目前MAC地址可以通过逻辑的方式进行修改,但它最初是被设计为不可人为更改的硬件地址。虽然MAC地址也可以满足唯一性的要求,但由于它不可由管理员根据需求通过逻…...
安防视频/集中云存储平台EasyCVR(V3.3)部分通道显示离线该如何解决?
安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…...
软件测试经典面试题:如何进行支付功能的测试?
非现金支付时代,非现金支付已经成为了生活不可或缺的一部分,我们只需要一台手机便可走遍全国各地(前提是支付宝,微信有钱<00>),那么作为测试人员,支付测试也是非常重要的一环,那么下面我就…...
SolidWorks 入门笔记03:生成工程图和一键标注
默认情况下,SOLIDWORKS系统在工程图和零件或装配体三维模型之间提供全相关的功能,全相关意味着无论什么时候修改零件或装配体的三维模型,所有相关的工程视图将自动更新,以反映零件或装配体的形状和尺寸变化;反之&#…...
【Java】对象内存图多个对象同一内存地址
目录 学生类 单个对象内存图 多个对象指向同一个内存地址 学生类 Student.java如下: package com.面向对象;public class Student {String name;int age;public void work() {System.out.println("开始敲代码...");} }StudentDemo.java如下ÿ…...
Python 笔记05(装饰器的使用)
一 装饰器的使用 (property) property 是 Python 中用于创建属性的装饰器。它的作用是将一个类方法转换为类属性,从而可以像 访问属性一样访问该方法,而不需要使用函数调用的语法。使用 property 主要有以下好处: 封装性和隐藏实现细节&…...
记忆化搜索,901. 滑雪
901. 滑雪 - AcWing题库 给定一个 R 行 C 列的矩阵,表示一个矩形网格滑雪场。 矩阵中第 i行第 j 列的点表示滑雪场的第 i 行第 j列区域的高度。 一个人从滑雪场中的某个区域内出发,每次可以向上下左右任意一个方向滑动一个单位距离。 当然࿰…...
计算机网络:连接世界的纽带
计算机网络的基础概念 计算机网络是一组相互连接的计算机,它们通过通信链路和协议进行数据交换和资源共享。以下是一些关键概念: 1. 节点和主机 网络中的计算机设备称为节点,通常是主机或服务器。主机是普通用户或终端设备,而服…...
SpringMVC 学习(三)注解开发
4. 注解开发 4.1 环境搭建 (1) 新建 maven 模块 springmvc-03-annotation (2) 确认依赖 确认方法同 3(2),手动导入发布依赖见3(11) <!--资源过滤--> <build><resources><resource><directory>src/main/java</directory>&…...
0x84加密数据传输服务
为了在安全模式下实现一些诊断服务,在服务端和客户端应用程序之间添加了Security sub-layer。在客户端与服务端之间进行诊断服务数据传输有两种方法: 1、非安全模式下数据传输 应用程序使用诊断服务(diagnostic Services)和应用层服务原语(Applicati…...
Vue.js快速入门:构建现代Web应用
Vue Vue.js是一款流行的JavaScript框架,用于构建现代的、交互式的Web应用程序。它具有简单易学的特点,同时也非常强大,能够帮助开发者构建高效、可维护的前端应用。本篇博客将带你快速入门Vue.js,并演示如何构建一个简单的Vue应用…...
Scala第五章节
Scala第五章节 scala总目录 章节目标 掌握方法的格式和用法掌握函数的格式和用法掌握九九乘法表案例 1. 方法 1.1 概述 实际开发中, 我们需要编写大量的逻辑代码, 这就势必会涉及到重复的需求. 例如: 求10和20的最大值, 求11和22的最大值, 像这样的需求, 用来进行比较的逻…...
erlang练习题(三)
题目一 查询列表A是否为列表B的前缀 解答 isPrefix([], List2) -> io:format("A is prefix of B ~n");isPrefix([H1 | ListA], [H2 | ListB]) ->case H1 H2 oftrue -> isPrefix(ListA, ListB);false -> io:format("A is not prefix of B ~n&quo…...
What Is A DNS Amplification DDoS Attack?
什么是 DNS 放大攻击? 域名系统 (DNS) 是用于在网站的机器可读地址(例如 191.168.0.1:80)和人类可读名称(例如 radware.com)之间进行解析的目录在 DNS 放大攻击中,攻击者…...
jvm笔记
好处: 跨平台 内存管理机制,垃圾回收功能 数组下标越界检查 多态 名词解释: jvm java虚拟机,是java程序的运行环境 jre jvm基础类库 jdk jre编译工具 javase jdkide工具 javaee javase应用服务器 jvm的内存结构: 程序…...
WPF中的控件
内容控件:label、border Window控件 Label控件 Border控件 内容控件 Button控件 点击取消按钮关闭程序;点击登录按钮打开BorderWindow窗口。 TextBox控件 PasswordBox控件 TextBlock控件 加载窗口时显示TextBlock中的内容 RadioButton控件 CheckBox控件…...
Java下对象的序列化和反序列化(写出和读入)
代码如下: public class MyWork {public static void main(String[] args) throws IOException, ClassNotFoundException {//序列化File f new File("testFile/testObject.txt");ObjectOutputStream oos new ObjectOutputStream(new FileOutputStream(…...
基于springboot的洗衣店订单管理系统
目录 前言 一、技术栈 二、系统功能介绍 顾客信息管理 店家信息管理 店铺信息管理 洗衣信息管理 预约功能 洗衣信息 交流区 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息互联网信息的飞速发展,无纸化作业变成了一种趋势&#x…...
Llama2部署踩坑
1、权重是.bin,但是报错找不到.safetensors 明明权重文件是.bin,但是却提示我缺少.safetensors。最后发现好像是 llama2-7b这个模型文件不行,必须要llama2-7b-chat这个模型才能读取的通,具体原因还暂不明确。...
Adams齿轮副
1.运动副 添加旋转副的时候,必须先物体后公共part(即此处的ground),最后再选择质心点 2.啮合点 啮合点marker的z轴必须是齿轮分度圆的切线方向 3.啮合点 两齿轮的旋转副,和啮合点,即cv marker ,必须属…...
衢州网站公司/seo优化中商品权重主要由什么决定
烤瓷牙可真是种类繁多,种类主要分为金属烤瓷牙和全瓷烤瓷牙两大类。金属烤瓷牙分为非贵金属烤瓷牙、半贵金属烤瓷牙、贵金属烤瓷牙和钛及钛合金烤瓷牙。其中非贵金属烤瓷牙又被分为全瓷釉瓷贴面、全瓷冠、烤瓷冠。 1.镍铬合金 较早的烤瓷牙多用镍铬合金,…...
网站的文案/搜狗网站
Hancitor’s Use of Cobalt Strike and a Noisy Network Ping Tool 执行摘要 Hancitor是一种信息窃取程序和恶意软件下载程序,被指定为MAN1,Moskalvzapoe或TA511的威胁参与者使用。在2018年的威胁简介中,我们指出Hancitor相对不成熟&#x…...
旅游公司网站建设/seo是什么意思中文
公司是个电子商务网站,电子商务网站就要涉及到订单的处理及物流费用的统计.这里暂时说下物流费用的统计,订单的处理很早前就想写了,只是太懒惰了,呵呵.事先声明一下,本人只是新手,发的文章是希望大家指点的,光拍砖不给建议的,怕怕哦~~ 先大概说下公司的情况,也好让大家明白…...
wordpress主题404页面/武汉全网推广
最近几天,有的人在偷偷地买蚂蚁的基金,有的人却偷偷的在蚂蚁面试。 最近确实是面试的好时候。大家都奔着大厂去的,最近也分享了好多大厂的面经了,什么阿里、字节、京东、美团、百度、腾讯、滴滴、网易…已经数不清有多少了。&…...
wordpress自定义文章列表/seo长尾快速排名
声明:本博客为原创博客,未经同意。不得转载!大多数人最经常使用的截屏方法可能就是利用手机的快捷按键了,可是那样假设要导入到电脑中效率会比較低。实际上有更好的截屏方式,最简单的当然就是利用Eclipse中的DDMS进行截…...
威海做网站的公司/网站推广策划案
YUV格式的解析YUV是指亮度参量和色度参量分开表示的像素格式,而这样分开的好处就是不但可以避免相互干扰,还可以降低色度的采样率而不会对图像质量影响太大。YUV是一个比较笼统地说法,针对它的具体排列方式,可以分为很多种具体的格…...