Google Play | play.google.com/apps/publis…[1] |
---|---|
应用宝 | open.qq.com/[2] |
百度手机助手 | app.baidu.com/[3] |
360 手机助手 | dev.360.cn/[4] |
vivo 应用商店 | dev.vivo.com.cn/[5] |
OPPO 软件商店(一加) | open.oppomobile.com/[6] |
小米应用商店 | dev.mi.com/[7] |
华为应用市场 | developer.huawei.com/consumer/cn…[8] |
阿里应用分发平台(豌豆荚) | open.uc.cn/[9] |
搜狗手机助手 | zhushou.sogou.com/open/[10] |
锤子应用商店 | dev.smartisan.com/[11] |
魅族应用商店 | open.flyme.cn/[12] |
金立软件商店 | open.appgionee.com/[13] |
安智市场 | dev.anzhi.com/[14] |
酷安市场 | developer.coolapk.com[15] |
联想乐商店 | open.lenovo.com/[16] |
三星应用开发者平台 | support-cn.samsung.com/App/Develop…[17] |
- 使用
Wrap
布局: 将Wrap
组件包裹住选项,这样可以在水平空间不足时自动换行,以避免溢出屏幕。Wrap
可以根据内容的大小自动调整布局。 - 提取通用方法: 将类似的代码块提取为通用方法,以减少重复代码。这将帮助你简化代码并使其更易于维护。
- 缩小间距: 调整
SizedBox
组件的宽度,以减少选项之间的间距。你可以根据需要微调间距的大小。
springboot微服务如何在服务器上查看日志
- 查看控制台输出:在服务器上启动Spring Boot微服务时,控制台会输出日志信息。您可以通过SSH登录到服务器,并在控制台中查看应用程序的输出日志。
- 查看日志文件:Spring Boot会将日志输出到指定的日志文件中,默认情况下,Spring Boot会将日志输出到应用程序的工作目录下的
logs
文件夹中。您可以通过SSH登录到服务器,然后使用文本编辑器或者命令行工具查看日志文件。 - 使用日志管理工具:在生产环境中,通常会使用专业的日志管理工具来集中管理和查看日志。常见的日志管理工具包括ELK Stack(Elasticsearch、Logstash、Kibana)、Splunk等。这些工具可以帮助您在服务器上集中收集、搜索和分析日志信息,便于快速定位问题。
- 使用日志级别控制:在Spring Boot中,可以通过配置日志级别来控制日志的输出。常见的日志级别有DEBUG、INFO、WARN、ERROR等。您可以根据需求将日志级别设置为适当的级别,以便只输出关键信息。
在Linux或Unix系统中,您可以使用cat
命令或tail
命令来查看日志文件的内容。以下是常用的命令示例:
使用cat
命令查看完整的日志文件内容:
cat /path/to/your/logfile.log
使用tail
命令查看日志文件的末尾部分(默认显示最后10行):
tail /path/to/your/logfile.log
您也可以使用-n
参数指定显示的行数,例如显示最后20行:
tail -n 20 /path/to/your/logfile.log
如果日志文件比较大,可以使用less
命令进行分页查看:
less /path/to/your/logfile.log
使用space
键向下翻页,使用b
键向上翻页,使用q
键退出查看。
如果您希望在实时监视日志文件的更新,可以使用tail
命令的-f
参数:
tail -f /path/to/your/logfile.log
这将实时显示日志文件的末尾部分,并持续监视文件的更新。
server
:此部分用于配置嵌入式服务器属性。port
:此属性指定服务器将监听的端口号。在此情况下,服务器将监听00000端口。
spring: application: name: service
spring
:此部分包含Spring Boot相关的配置。application
:此子部分用于配置Spring应用程序属性。name
:此属性设置Spring应用程序的名称。在此情况下,应用程序名称设置为"sys-service"。
cloud: nacos: discovery: server-addr: username: password:
cloud
:此部分用于配置Spring Cloud组件。nacos
:此子部分用于配置Nacos服务发现。discovery
:此子部分配置Nacos发现的属性。server-addr
:此属性用于指定Nacos服务器的地址。应填写Nacos服务器的地址,例如:server-addr: http://localhost:8848
。username
:如果需要与Nacos服务器进行身份验证,则可以使用此属性进行配置。如果不需要身份验证,则可以将此属性留空。password
:如果需要与Nacos服务器进行身份验证,则可以使用此属性配置密码。如果不需要身份验证,则可以将此属性留空。
private Set<Integer> topONumSet; //所有权限组织的顶级组织序号 // 注入 Spring 的环境变量,用于获取配置信息 @Autowired private Environment env; // 通过 @Value 注解获取配置文件中的属性值 // 系统数据库地址 @Value("${sys.datasource.url}") // 系统数据库密码 // 系统数据库驱动类名 // 创建名为 "sysDataSource" 的 Bean,作为系统数据源 // 打印系统数据库地址到日志 // 设置 DruidDataSource 的属性 dataSource // 设置数据库连接地址 // 设置数据库用户名 // 设置数据库密码 // 设置数据库驱动类名 dataSource.setInitialSize(2); // 设置初始化时的连接数 dataSource.setMaxActive(20); // 设置最大活跃连接数 dataSource.setMinIdle(0); // 设置最小空闲连接数 dataSource.setMaxWait(60000); // 设置获取连接的最大等待时间 dataSource.setValidationQuery("SELECT 1"); // 设置用于校验连接是否有效的 SQL 查询语句 setTestOnBorrow(false); // 设置是否在获取连接时校验连接的有效性 setTestWhileIdle(true); // 设置是否在空闲时校验连接的有效 setPoolPreparedStatements(false); // 设置是否缓存预编译语句 setDefaultAutoCommit(false); // 设定不自动提交事务
// 创建名为 "sysSqlSessionFactory" 的 Bean,用于管理系统数据库的 SqlSessionFactory // 设置系统数据源 // 设置系统数据库的 MyBatis Mapper 文件的位置,指定 mapper 文件所在的目录 // 设置 MyBatis 的插件,这里使用了 ComConfig 类中的 pageHelperSetting() 方法返回的拦截器 // 返回配置好的 SqlSessionFactory // 创建日志记录器,用于输出日志信息 // 从配置文件中获取 Redis 的主机名 // 从配置文件中获取 Redis 的端口号 // 从配置文件中获取 Redis 的连接超时时间 // 从配置文件中获取 Redis 的密码 // 从配置文件中获取 Redis 的数据库索引 // 从配置文件中获取 Redis 连接池的最大空闲连接数 // 从配置文件中获取 Redis 连接池的最小空闲连接数 // 创建名为 "sysRedisTemplate" 的 Bean,用于管理 RedisTemplate 实例 // 创建 Jedis 连接工厂 jedisConnectionFactory // 设置 Redis 主机名 // 设置 Redis 端口号 // 设置 Redis 密码 // 设置存储的数据库索引 // 设置连接超时时间 // 使用连接池 // 创建 Jedis 连接池配置 // 设置连接池的最大空闲连接数 // 设置连接池的最小空闲连接数 // 将连接池配置设置给连接工厂 // 调用 ComConfig 类中的 strRedisTemplate 方法,创建并配置 RedisTemplate 实例,并返回该实例 jedisConnectionFactory
// 声明一个静态变量来保存 Spring 的 ApplicationContext 对象 // 实现接口 ApplicationContextAware 的方法,用于获取 Spring 的 ApplicationContext 对象 // 将传入的 ApplicationContext 对象赋值给静态变量 context // 提供一个静态方法,根据 Bean 名称获取对应的 Spring Bean 实例 // 如果 context 为空,则返回 null // 提供一个静态方法,用于获取所有已注册的 Bean 名称 // 返回所有已注册的 Bean 名称数组
// 定义一个静态方法,用于配置 MyBatis 分页插件 PageHelper // 创建一个 PageInterceptor 对象作为分页插件的实例 // 创建一个 Properties 对象用于设置分页插件的属性 // 将 offset 参数当成页码 // 使用 RowBounds 分页时进行 count 查询 // 是否合理化分页参数(启用合理化时,如果 pageNum < 1,会自动设置为 1;如果 pageNum > pages,会自动设置为 pages) properties.setProperty("dialect", "mysql"); //4.0.0以后不要配置数据源 // 当 pageSize=0 时查询返回全部结果(相当于没有执行分页查询) // 支持通过 Mapper 接口参数来传递分页参数 // 不返回 Page 类型,返回 PageInfo 类型 // 将设置好的属性赋值给分页插件 // 返回配置好的分页插件实例 // 定义一个静态方法,用于配置 RedisTemplate // 创建一个 RedisTemplate 实例 // 设置连接工厂,即连接到 Redis 的配置 // 设置 key 和 hash key 的序列化方式为 StringRedisSerializer / 设置 hash value 和 value 的序列化方式为 StringRedisSerializer // 初始化 RedisTemplate // 返回配置好的 RedisTemplate 实例
// 用于注入配置属性值 spring.application.name // 实现 EnvironmentAware 接口,用于获取 Spring 的 Environment 对象 // 在 Spring 环境准备就绪后,会调用此方法 // 检查是否已经设置了系统属性 "project.name",如果没有设置,则将 applicationName 的值赋给该系统属性
// 静态Logger,用于日志记录 // 用于存储 RestHighLevelClient 实例 // 用于存储 BulkProcessor 实例 // 在初始化阶段执行的方法 // 创建基本的凭证提供者 // 创建 RestClientBuilder // 创建 RestHighLevelClient 实例 // 创建 BulkProcessor.Listener 实例 // 在执行批处理前调用 beforeBulk // 在执行批处理后调用(成功) afterBulk // 在执行批处理后调用(失败) afterBulk // 创建 BulkProcessor.Builder 实例 // 设置 BulkProcessor 的配置属性 // 到达10000条时刷新 // 内存到达8M时刷新 // 设置的刷新间隔10s // 设置允许执行的并发请求数 // 设置重试策略 // 构建 BulkProcessor 实例 // 创建名为 "esRestHighLevelClient" 的 RestHighLevelClient Bean // 在销毁阶段执行的方法 // 创建名为 "esRestBulkProcessor" 的 BulkProcessor Bean // 获取 HttpHost 数组
// 启用Swagger2注解 // 启用Knife4j注解,Knife4j是Swagger的增强工具包 // 创建一个名为 createRestApi 的 Docket Bean // 创建一个 Docket 实例,使用 Swagger 2 规范 // 设置API信息 // 扫描带有 @ApiOperation 注解的方法 // 扫描指定包下的类 // 匹配所有路径 // 设置全局参数 // 创建一个 ApiInfo 实例,用于设置 API 文档信息 // API 标题 // 服务条款 URL // API 版本
// 将自定义的拦截器注入为一个 Bean // 配置内容协商,设置默认的响应内容类型为 JSON 格式 // 配置跨域资源共享(CORS)规则 .allowedOrigins("*") // 允许的源 // 允许的HTTP方法 "POST", "GET", "PUT", "OPTIONS", "DELETE" // 预检请求的缓存时间 // 允许跨域请求携带认证信息 // 添加拦截器,并配置拦截规则和排除规则 .addPathPatterns("/**") // 拦截所有路径 // 添加静态资源处理器,用于处理 Swagger UI 页面 // 配置默认的 Servlet 处理器
// 自动注入 SysMenuService // API 操作文档的注解,描述接口的用途和输入参数 // POST 请求映射到 /pageQuery,接收 JSON 请求体 // 将 JSON 请求体解析为 xxx 对象 // 创建 xxxBO 对象,用于业务操作 // 调用 xxxService 的分页查询方法 // 返回失败响应,并记录错误日志
// 定义API标签 // 使用Lombok注解,自动生成Logger // 表明这是一个REST控制器 // 静态Logger,用于记录日志 // 自动注入 SysOrgService、SysUserOrgService、SysRoleOrgService // 自动注入 RedisTemplate // 调用 xxxService 的删除组织方法 // 删除与该组织相关的用户组织关联信息 // 构建 SysRoleOrg 对象,设置组织ID,并删除与该组织相关的角色组织关联信息 // 创建 Page 对象并拷贝 PageInfo 属性 // 将传入的 JSON 请求体转换为 组织树 对象 // 用于存储组织树节点的列表 // 未传入 orgId,默认根节点为父节点 // 默认根 // 获取缓存中的 系统组织 对象 // 创建根节点 // 添加根节点到树节点列表 // 递归添加子节点 // 获取所有权限编号集合 // 获取缓存中的 系统组织 对象 // 判断是否具有权限 // 创建权限不足的返回结果 // 创建根节点 // 添加根节点到树节点列表 // 递归添加子节点 // 未传入 orgId,默认根节点为父节点 // 批量查询根据权限编号集合获取的 系统组织 列表 // 查找用户顶级机构 // 获取缓存中的顶级子节点 SysOrg 对象 // 如果根节点的子节点列表为空,则初始化子节点列表 // 添加子节点到根节点的子节点列表
// 表示这是一个 RESTful 风格的 Controller // 根据角色ID删除旧的角色菜单关联 // 循环插入新的角色菜单关联 // 记录日志,表示批量新增角色菜单成功,并输出新增的角色菜单关联列表 // 创建成功的返回结果 // 记录异常信息,表示批量新增角色菜单失败 // 创建失败的返回结果 // 后续方法类似,实现角色菜单的删除、查询和查询用户菜单等功能 // 如果系统菜单列表不为空且长度大于0,则执行以下操作 //制作父菜单Id映射 // 创建用于存储父菜单Id映射的 HashMap / 创建用于存储菜单Id映射的 HashMap // 遍历系统菜单列表中的每个菜单项 // 获取当前菜单项的父菜单Id // 获取存储在父菜单Id映射中的子菜单Id列表 // 如果列表为空,则将子菜单Id列表初始化为空列表 // 将当前菜单项的菜单Id添加到子菜单Id列表中 // 将菜单Id与菜单项对象建立映射关系 // 设置根菜单Id为配置文件中的 menuRoot 属性值 // 通过递归调用 sysAppMenuService 的 getChildMenuNode 方法构建菜单树 // 如果构建的菜单树为空,则初始化为一个空的列表
// 从缓存中获取组织信息的JSON数据 // 使用 xx 将 xxxStr 中的JSON数据映射为 xxx 对象 // 从缓存中获取组织信息的JSON数据 // 将角色的组织编号设置为所属组织的编号 // 遍历查询结果中的角色列表 根据组织ID查询组织信息
// 获取用户所属组织信息 // 插入新的系统用户记录 // 添加用户所属组织,以及菜单角色 List<SysUserRole> sysUserRoleList = new ArrayList<>(); // Populate sysUserRoleList with SysUserRole objects List<String> roleIdList = new ArrayList<>(); if (sysUserRoleList != null && sysUserRoleList.size() > 0) { roleIdList = sysUserRoleList.stream() .map(s -> s.getRoleId()) // 提取每个元素的 roleId 属性 .collect(Collectors.toList()); // 将提取出的 roleId 值收集到 roleIdList } System.out.println(roleIdList);
假设sysUserRoleList
中包含以下两个对象:
SysUserRole(roleId = "123")
SysUserRole(roleId = "456")
在这种情况下,运行示例代码后,输出会是:
[123, 456]
这表示我们从sysUserRoleList
中提取了两个不同的roleId
值,分别为"123"和"456",然后将它们存放在了roleIdList
中。
ClickHouse 是一个用于联机分析处理(OLAP)的开源列式数据库管理系统(DBMS)。它专门设计用于处理大规模数据分析工作负载,可以在秒级甚至亚秒级内查询数十亿行数据。ClickHouse 的列式存储和数据压缩技术使其在分析查询性能方面表现出色。它广泛用于需要快速数据分析的场景,如在线广告业务、数据仓库、日志分析等。
仓库地址:https://github.com/webVueBlog/JavaGuideInterview
参考资料
[1]
https://play.google.com/apps/publish/?hl=zh-CN: https://link.juejin.cn?target=https://play.google.com/apps/publish/?hl=zh-CN
[2] http://open.qq.com/: https://link.juejin.cn?target=http://open.qq.com/
[3] http://app.baidu.com/: https://link.juejin.cn?target=http://app.baidu.com/
[4] http://dev.360.cn/: https://link.juejin.cn?target=http://dev.360.cn/
[5] https://dev.vivo.com.cn/: https://link.juejin.cn?target=https://dev.vivo.com.cn/
[6] http://open.oppomobile.com/: https://link.juejin.cn?target=http://open.oppomobile.com/
[7] https://dev.mi.com/: https://link.juejin.cn?target=https://dev.mi.com/
[8] http://developer.huawei.com/consumer/cn/: https://link.juejin.cn?target=http://developer.huawei.com/consumer/cn/
[9] http://open.uc.cn/: https://link.juejin.cn?target=http://open.uc.cn/
[10] http://zhushou.sogou.com/open/: https://link.juejin.cn?target=http://zhushou.sogou.com/open/
[11] http://dev.smartisan.com/: https://link.juejin.cn?target=http://dev.smartisan.com/
[12] http://open.flyme.cn/: https://link.juejin.cn?target=http://open.flyme.cn/
[13] http://open.appgionee.com/: https://link.juejin.cn?target=http://open.appgionee.com/
[14] http://dev.anzhi.com/: https://link.juejin.cn?target=http://dev.anzhi.com/
[15] https://developer.coolapk.com: https://link.juejin.cn?target=https://developer.coolapk.com
[16] http://open.lenovo.com/: https://link.juejin.cn?target=http://open.lenovo.com/
[17] http://support-cn.samsung.com/App/DeveloperChina/Home/Index: https://link.juejin.cn?target=http://support-cn.samsung.com/App/DeveloperChina/Home/Index