首页 文章 精选 留言 我的

精选列表

搜索[GA4集成],共10008篇文章
优秀的个人博客,低调大师

支付宝预授权集成流程

一、文档地址 官方文档地址:[url]https://docs.open.alipay.com/20180417160701241302[/url] 二、开发前准备工作 1、签约:[url]https://openclub.alipay.com/read.php?tid=276&fid=72[/url] 2、创建应用:[url]https://openclub.alipay.com/read.php?tid=1606&fid=72[/url] 3、生成密钥:[url]https://openclub.alipay.com/read.php?tid=1833&fid=69[/url] 4、下载服务端sdk:[url]https://docs.open.alipay.com/54/106370/[/url] 注意事项:1、不

优秀的个人博客,低调大师

app支付集成开发者指南

鉴于很多对接app支付的童鞋经常出现app支付系统繁忙,ali40247,订单信息异常在等等的错误,其实那些错误都是大同小异的,无非就是没权限,密钥不对,参数传值错误,请求信息拼接有问题等等,所以这边写app支付开发指南分享帖,希望能够帮到大家!!! 一、文档地址 app支付官方文档地址:[url]https://docs.open.alipay.com/204[/url] 二、开发前准备工作 1、签约:[url]https://openclub.alipay.com/read.php?tid=276&fid=72[/url] 2、创建应用:[url]https://openclub.alipay.com/read.php?tid=1606&fid=72[/url] 3、生成密钥:[url]https://openclub.

优秀的个人博客,低调大师

条码支付集成开发者指南

本帖仅供参考,非官方demo 一、官方文档 文档地址:点击【查看】 sdk下载:点击【查看】 官方demo下载地址:点击【查看】 二、开发前准备工作 1、签约:[url]https://openclub.alipay.com/read.php?tid=276&fid=72[/url] 2、创建应用:[url]https://openclub.alipay.com/read.php?tid=1606&fid=72[/url] 3、生成密钥:[url]https://openclub.alipay.com/read.php?tid=1833&fid=69[/url] 4、下载服务端sdk:[url]https://docs.open.alipay.com/54/106370/[/url] 如何签约以及签约无法成功等相关签约问题:[

优秀的个人博客,低调大师

支付宝卡包集成流程

该产品可以用于管理电子凭证的产品,该产品聚合来自各类生活服务的票据凭证,包括优惠券、折扣券、代金券、换购券、电影票、演出票、火车票、机票。 用户交易创建后,企业或者个人开发者根据交易外部订单号可以通过支付宝提供的开放接口,把卡券添加到支付宝卡包,用户可以通过支付宝钱包客户端,在卡包功能中查看并使用卡券。 一、文档地址 官方文档地址:[url]https://docs.open.alipay.com/199/105248/[/url] 二、开发前准备工作 调用步骤:[url]https://openclub.alipay.com/read.php?tid=12194&fid=69[/url] 注意事项:1、支持沙箱测试;2、不需签约,但需要添加功能;3、支持第三方调用。 检查调用appid的应用功能列表中是否添加“支付宝卡包”。 三、接口集

优秀的个人博客,低调大师

grafana安装使用及与zabbix集成

grafana简介 Grafana是一个完全开源的度量分析与可视化平台,可对来自各种各种数据源的数据进行查询、分析、可视化处理以及配置告警。 Grafana支持的数据源: 官方:Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,MySQL等; 插件:open-falcon、zabbix... Centos 7.3 安装Grafana 6.0 yum安装 $ yum install -y https://dl.grafana.com/oss/release/grafana-6.0.2-1.x86_64.rpm 启动Grafana $ systemctl start grafana-server $ systemctl enable grafana-server 启动后可以直接在浏览器访问:http://ip:3000 Grafana文件结构 日志文件:/var/log/grafana 数据文件:/var/lib/grafana/grafana.db 默认为sqlite3数据库,也可以使用mysql、postgres,配置方法 (Tips:升级前要备份数据文件) 。 配置文件: /etc/grafana/grafana.ini 配置Grafana Note: 更改Grafana配置文件后需要重启Grafana服务生效。 配置文件中以 ; 开头的行为注释行。 paths # default_section instance_name = TEST_ENV # 实例名称,默认为主机名 [paths] ;data = /var/lib/grafana # 数据文件存放位置 ;temp_data_lifetime = 24h # 临时数据保存时间,默认为24小时 ;logs = /var/log/grafana # 日志文件存放位置 ;plugins = /var/lib/grafana/plugins # Grafana默认查找插件的位置 ;provisioning = conf/provisioning # Grafana启动时依赖的配置文件存放位置 server [server] ;protocol = http # 网络协议,如http、https、socket ;http_addr = localhost # 绑定的ip,留空表示绑定所有网卡ip ;http_port = 3000 # 访问端口 ;domain = localhost # 这个设置是root_url的一部分,当你通过浏览器访问grafana时的公开的domian名称,默认是localhost ;enforce_domain = false # 如果主机的header不匹配domian,则跳转到一个正确的domain上,默认是false。防止dns重写攻击 ;root_url = http://localhost:3000 # 这是一个web上访问grafana的全路径url,默认是%(protocol)s://%(domain)s:%(http_port)s/ ;router_logging = false # 是否记录web请求日志,默认是false ;static_root_path = public # 前端文件(HTML,JS和CSS文件)的目录路径。 默认为public ;enable_gzip = false ;cert_file = # 如果使用https则需要设置 ;cert_key = # 如果使用https则需要设置 ;socket = /tmp/grafana.sock # socket文件位置 database [database] ;type = sqlite3 # 数据库可以是mysql、postgres、sqlite3,默认是sqlite3 ;host = 127.0.0.1:3306 # 只是mysql、postgres需要,默认是127.0.0.1:3306 ;name = grafana # grafana的数据库名称,默认是grafana ;user = root # 数据库用户名 ;password = # 数据库密码 ;url = # 使用URL配置数据库 ;ssl_mode = disable # mysql、postgres使用 ;path = grafana.db # 只是sqlite3需要,定义sqlite3的存储路径 session [session] ;provider = file # 默认是file,值还可以是memory、mysql、postgres、redis、memcache ;provider_config = sessions # 这个值的配置由provider的设置来确定,可参考官网配置用例 ;cookie_name = grafana_sess # grafana的cookie名称 ;cookie_secure = false # 如果设置为true,则grafana依赖https,默认是false ;session_life_time = 86400 # session过期时间,默认是86400秒,24小时 log [log] ;mode = console file # 可以是console、file、syslog,默认是console、file ;level = info # 日志级别 ;filters = # 可选设置为特定的记录设置不同的级别 [log.console] ;level = # 日志级别 ;format = console # 日志格式,支持console、text、json [log.file] ;level = # 日志级别 ;format = text # 日志格式,支持console、text、json ;log_rotate = true # 是否开启自动轮转 ;max_lines = 1000000 # 单个日志文件的最大行数,默认是1000000 ;max_size_shift = 28 # 单个日志文件的最大大小,默认是28,表示256MB ;daily_rotate = true # 每天是否进行日志轮转,默认是true ;max_days = 7 # 日志过期时间,默认是7,7天后删除 security [security] ;admin_user = admin # 管理员用户,启动时创建 ;admin_password = admin # 管理员密码,首次启动前可更改或在配置文件设定 ;secret_key = SW2YcwTIb9zpOOhoPsMm # 加密 ;disable_gravatar = false # 禁用gravatar图片文件 ;data_source_proxy_whitelist = # 数据源代理白名单,ip_or_domain:port ,多个用空格分隔 ;disable_brute_force_login_protection = false # 禁止暴力破解 ;cookie_secure = false # 如果使用https,设置为true,默认为false # set cookie SameSite attribute. defaults to `lax`. can be set to "lax", "strict" and "none" ;cookie_samesite = lax # 设置同意站点cookie相同,防止跨域攻击,可以设置为"lax", "strict" and "none" dashboards ;versions_to_keep = 20 # 可保持会话个数 users [users] ;allow_sign_up = true # 是否允许普通用户登录,如果设置为false,则禁止用户登录,默认是true,则admin可以创建用户,并登录grafana ;allow_org_create = true # 如果设置为false,则禁止用户创建新组织,默认是true ;auto_assign_org = true # 当设置为true的时候,会自动的把新增用户增加到id为1的组织中,当设置为false的时候,新建用户的时候会新增一个组织 ;auto_assign_org_role = Viewer # 新建用户附加的规则,默认是Viewer ;login_hint = email or username # 首页user框中的背景文字 ;default_theme = dark # 默认页面的背景 [auth] ;disable_login_form = false # true隐藏登陆框,默认false auth [auth] ;login_cookie_name = grafana_session # session名称 ;login_maximum_inactive_lifetime_days = 7 # session保持时间 ;login_maximum_lifetime_days = 30 # session保持最长时间 ;token_rotation_interval_minutes = 10 # 登陆状态,用户认证token更新频率,默认为10分钟 [auth.anonymous] ;enabled = false # 禁止匿名登陆 auth.basic [auth.basic] ;enabled = true # 当设置为true,则http api开启基本认证 auth.proxy [auth.proxy] # 允许你在一个HTTP反向代理上进行认证设置 ;enabled = false ;header_name = X-WEBAUTH-USER ;header_property = username ;auto_sign_up = true # 默认是true。开启自动注册,如果用户在grafana DB中不存在 ;ldap_sync_ttl = 60 ;whitelist = 192.168.1.1, 192.168.2.1 # 白名单 auth.ldap [auth.ldap] ;enabled = false # 开启ldap用户认证 ;config_file = /etc/grafana/ldap.toml # ldap认证相关配置文件 ;allow_sign_up = true # 允许登陆 alerting [alerting] enabled = true # 设置为false以禁用警报引擎,并从UI中隐藏警报 execute_alerts = true # 是否执行报警规则 analytics [analytics] reporting_enabled = true # 如果设置为true,则会发送匿名使用分析到stats.grafana.org,主要用于跟踪允许实例、版本、dashboard、错误统计。默认是true check_for_updates = true # 更新检查设置 google_analytics_ua_id = # 使用GA进行分析,填写你的GA ID即可 smtp [smtp] ;enabled = false # 是否开启 ;host = localhost:25 # ip和端口 ;user = ;password = ;cert_file = ;key_file = ;skip_verify = false ;from_address = admin@grafana.localhost # 发送邮箱名 ;from_name = Grafana # 发送人 Grafana用mysql做数据源 创建数据库及账号 mysql> create database grafana DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; mysql> GRANT ALL ON grafana.* TO 'grafana'@'127.0.0.1' IDENTIFIED BY 'grafana'; 修改database配置文件 [database] type = mysql host = 127.0.0.1:3306 name = grafana user = grafana password = grafana 确保session表存在 mysql> show tables like 'session%'; mysql> desc session; +--------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+----------+------+-----+---------+-------+ | key | char(16) | NO | PRI | NULL | | | data | blob | NO | | NULL | | | expiry | int(255) | NO | | NULL | | +--------+----------+------+-----+---------+-------+ 3 rows in set (0.01 sec) # 如果session表不存在,需要手动创建 mysql> CREATE TABLE `session` ( `key` CHAR(16) NOT NULL, `data` BLOB, `expiry` INT(255) UNSIGNED NOT NULL, PRIMARY KEY (`key`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; 修改session配置 [session] provider = mysql provider_config = grafana:grafana@tcp(127.0.0.1:3306)/grafana cookie_name = grafana_sess cookie_secure = false session_life_time = 8640 使用Grafana 完成上述配置后登陆Grafana,默认管理员用户——admin,默认管理员密码——admin,首次登陆需要更改管理员密码! 添加数据源 以MySQL为例添加数据源,Configuration——DataSource——Add data source——MySQL。注意,只对数据源用户授权select权限,且保证最小授权原则,eg: mysql> CREATE USER 'grafanaReader'@'localhost' IDENTIFIED BY 'grafana'; mysql> GRANT SELECT ON grafana.* TO 'grafanaReader'; 配置参考:http://docs.grafana.org/features/datasources/mysql/ grafana+zabbix插件 安装插件:Configuration——Plugins——"Find More Plugins on Grafana.com"——zabbix 查看远程可用插件 $ grafana-cli plugins list-remote id: abhisant-druid-datasource version: 0.0.5 id: agenty-flowcharting-panel version: 0.2.0 id: akumuli-datasource version: 1.2.8 id: alexanderzobnin-zabbix-app version: 3.10.1 ... 安装插件 $ grafana-cli plugins install alexanderzobnin-zabbix-app 查看已安装的插件 $ grafana-cli plugins ls installed plugins: alexanderzobnin-zabbix-app @ 3.10.1 Restart grafana after installing plugins . <service grafana-server restart> 安装完成后需要重启Grafana服务使生效: $ systemctl restart grafana-server 登陆web管理界面后需要启用插件,Configuration——Plugins——zabbix——Enable。 添加zabbix DataSource Configuration——DataSource——Add DataSource——zabbix——dashboard——import数据 官方文档

优秀的个人博客,低调大师

Springboot Application 集成 OSGI 框架开发

Java 类加载器 启动类加载器 (Bootstrap ClassLoader) 是 Java 类加载层次中最顶层的类加载器,负责加载 JDK 中的核心类库,如:rt.jar、resources.jar、charsets.jar 等 扩展类加载器(Extension ClassLoader) 负责加载 Java 的扩展类库,默认加载 JAVA_HOME/jre/lib/ext/目下的所有 jar 应用类加载器(Application ClassLoader) 负责加载应用程序 classpath 目录下的所有 jar 和 class 文件。 ClassLoader 使用的是双亲委托模型来搜索类的,每个 ClassLoader 实例都有一个父类加载器的引用(不是继承的关系,是一个包含的关系),虚拟机内置的类加载器(Bootstrap ClassLoader)本身没有父类加载器,但可以用作其它 ClassLoader 实例的的父类加载器。当一个 ClassLoader 实例需要加载某个类时,它会试图亲自搜索某个类之前,先把这个任务委托给它的父类加载器,这个过程是由上至下依次检查的,首先由最顶层的类加载器 Bootstrap ClassLoader 试图加载,如果没加载到,则把任务转交给 Extension ClassLoader 试图加载,如果也没加载到,则转交给 App ClassLoader进行加载,如果它也没有加载得到的话,则返回给委托的发起者,由它到指定的文件系统或网络等 URL 中加载该类。如果它们都没有加载到这个类时,则抛出 ClassNotFoundException 异常。否则将这个找到的类生成一个类的定义,并将它加载到内存当中,最后返回这个类在内存中的 Class 实例对象。 判别两个类是否相同,除了是相同的 class 字节码,还必须由同一类加载器加载。比如类 Example,javac 编译之后生成字节码文件 Example.class,ClassLoaderA 和 ClassLoaderB 这两个类加载器并读取了 Example.class 文件,并分别定义出了 java.lang.Class 实例来表示这个类,对于 JVM 来说,它们是两个不同的实例对象,但它们确实是同一份字节码文件,如果试图将这个 Class 实例生成具体的对象进行转换时,就会抛运行时异常 java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.Class OSGI 类加载器 OSGI 类加载器并不遵循 Java 的双亲委派模型,OSGi 为每个 bundle 提供一个类加载器,该加载器能够加载 bundle 内部的类和资源,bundle 之间的交互是从一个 bundle 类加载器委托到另一个 bundle 类加载器,所有 bundle 都有一个父类加载器。 Fragment bundle 是一种特殊的 bundle,不是独立的 bundle,必须依附于其他 bundle 来使用。通过 Fragment-Host 来指定宿主 bundle,同时也可以通过这种方式使用宿主的类加载器。 图 1.OSGI 类加载器 image OSGI 框架根据 Bundle 的 MANIFEST.MF 文件中描述的数据信息进行解析处理 Bundle 间的依赖关系。Fragment Bundle 的宿主 bundle 的检查在 bundle 解析之前已经完成,所以 Fragement Bundle 可以获取到宿主 bundle 的加载器信息。 Equinox OSGI ServletBridge 实现原理及源码解析 BridgeServlet 与 OSGI 容器 Equinox 提供了 servletbridge.jar 将 OSGI framework 和 servlet container 桥接起来,并且提供了一系列的 bundle 可以将 Equinox OSGI 应用嵌入到现有的 web 服务器中(eg. Tomcat)。servletbridge.jar 包含如下两个文件 (package: org.eclipse.equinox.servletbridge) BridgeServlet – 负责请求处理 FrameworkLauncher – 负责 OSGI bundle 启动管理 Web 工程被加载到 web 容器中,比如 Tomcat,容器读取 web 工程 WEB-INF 目录下的 web.xml 文件,通过 servlet mapping 指定相应的类处理请求...... https://www.ibm.com/developerworks/cn/java/j-springboot-application-integrated-osgi-framework-development/index.html 总结 本文从 Java 类加载器说起,探讨了 OSGI 的类加载器原理并对 Equinox 中的 Servletbridge 原理实现进行了详细的研究,同时扩展到使用这一原理如何在 Spring boot 应用中嵌入 OSGI 开发和 Spring boot 应用如何与 OSGI 插件之间进行相互调用。使用一个例子来对这一系列的使用做了进一步的讲解。并对它的实现方法做了进一步的探讨,这些探讨对于将 OSGI 应用嵌入到任何其他的系统中是一个启发和帮助,希望有兴趣的读者可以做进一步的了解和实现。

优秀的个人博客,低调大师

Java发送Email邮件及SpringBoot集成

一:普通方式发送 1.导包 <!--Java MAil 发送邮件API--> <dependency> <groupId>javax.mail</groupId> <artifactId>javax.mail-api</artifactId> <version>1.6.1</version> </dependency> <!-- 真正的实现库 --> <dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> <version>1.6.1</version> </dependency> 2.代码 实例:通过一个已知的163邮箱发送给他人邮件 public static void main(String[] args) throws MessagingException { // 1.创建一个程序与邮件服务器会话对象 Session Properties props = new Properties(); props.setProperty("mail.transport.protocol", "SMTP"); props.setProperty("mail.smtp.host", "smtp.163.com"); props.setProperty("mail.smtp.port", "25"); // 指定验证为true props.setProperty("mail.smtp.auth", "true"); props.setProperty("mail.smtp.timeout", "1000"); // 验证账号及密码,密码对应邮箱授权码(163密码可行,qq必须授权码) Authenticator auth = new Authenticator() { public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("xxxx@163.com", "xxxxx"); } }; Session session = Session.getInstance(props, auth); // 2.创建一个Message,它相当于是邮件内容 Message message = new MimeMessage(session); // 设置发送者 message.setFrom(new InternetAddress("xxx同上xxx@163.com")); // 设置发送方式与接收者 message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress("xx10086xx@qq.com")); // 设置主题 message.setSubject("邮件发送测试"); // 设置内容 message.setContent("Hello!", "text/html;charset=utf-8"); // 3.创建 Transport用于将邮件发送 Transport.send(message); } 二:SpringBoot的JavaMailSenderImpl发送 1.在resources下新建mailConfig.properties mailConfig.properties #服务器 mailHost=smtp.163.com #端口号 mailPort=25 #邮箱账号(使用者改成自己的) mailUsername=xxxxxx@163.com #邮箱密码(使用者改成自己的) mailPassword=xxxxx #时间延迟 mailTimeout=25000 2.新建一个类去读这个配置文件的内容 import java.io.IOException; import java.io.InputStream; import java.util.Properties; /** * Create by yster@foxmail.com 2018/5/28/028 21:00 */ public class MailConfig { private static final String PROPERTIES_DEFAULT = "mailConfig.properties"; public static String host; public static Integer port; public static String userName; public static String passWord; public static String emailForm; public static String timeout; public static String personal; public static Properties properties; static{ init(); } /** * 初始化 */ private static void init() { properties = new Properties(); try{ InputStream inputStream = MailConfig.class.getClassLoader().getResourceAsStream(PROPERTIES_DEFAULT); properties.load(inputStream); inputStream.close(); host = properties.getProperty("mailHost"); port = Integer.parseInt(properties.getProperty("mailPort")); userName = properties.getProperty("mailUsername"); passWord = properties.getProperty("mailPassword"); emailForm = properties.getProperty("mailUsername"); timeout = properties.getProperty("mailTimeout"); personal = "来自星星的我";//发送人 } catch(IOException e){ e.printStackTrace(); } } } 3.以上只是准备阶段,下面开始邮件编码 import cn.zyzpp.config.MailConfig; import org.springframework.mail.javamail.JavaMailSenderImpl; import org.springframework.mail.javamail.MimeMessageHelper; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import java.io.UnsupportedEncodingException; import java.util.Properties; /** * Create by yster@foxmail.com 2018/5/28/028 21:05 */ public class MailUtil { private static final String HOST = MailConfig.host; private static final Integer PORT = MailConfig.port; private static final String USERNAME = MailConfig.userName; private static final String PASSWORD = MailConfig.passWord; private static final String emailForm = MailConfig.emailForm; private static final String timeout = MailConfig.timeout; private static final String personal = MailConfig.personal; private static JavaMailSenderImpl mailSender = createMailSender(); /** * 邮件发送器 * * @return 配置好的工具 */ private static JavaMailSenderImpl createMailSender() { JavaMailSenderImpl sender = new JavaMailSenderImpl(); sender.setHost(HOST); sender.setPort(PORT); sender.setUsername(USERNAME); sender.setPassword(PASSWORD); sender.setDefaultEncoding("Utf-8"); Properties p = new Properties(); p.setProperty("mail.smtp.timeout", timeout); p.setProperty("mail.smtp.auth", "false"); sender.setJavaMailProperties(p); return sender; } /** * 发送邮件 * * @param to 接受人 * @param subject 主题 * @param html 发送内容 * @throws MessagingException 异常 * @throws UnsupportedEncodingException 异常 */ public static void sendMail(String to, String subject, String html) throws MessagingException,UnsupportedEncodingException { MimeMessage mimeMessage = mailSender.createMimeMessage(); // 设置utf-8或GBK编码,否则邮件会有乱码 MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8"); messageHelper.setFrom(emailForm, personal); messageHelper.setTo(to); messageHelper.setSubject(subject); messageHelper.setText(html, true); mailSender.send(mimeMessage); } 4.开始发送一封邮件 public static void main(String[] args){ try { MailUtil.sendMail("xxxx@qq.com", "标题", "内容"); } catch (MessagingException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } 欢迎关注博主!

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册