2024-09-03



import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import com.example.demo.security.jwt.JwtAuthenticationEntryPoint;
import com.example.demo.security.jwt.JwtAuthenticationFilter;
 
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
 
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
 
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // 配置用户详情服务及密码加密方式
        auth.inMemoryAuthentication()
                .withUser("user")
                .password(passwordEncoder().encode("password"))
                .roles("USER");
    }
 
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                // ... 其他配置 ...
                .csrf().disable() // 禁用CSRF保护
                .exceptionHandling().authenticationEntryPoint(new JwtAuthenticationEntryPoint())
                .and()
                .addFilterBefore(new JwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
    }
}

这个代码实例展示了如何在Spring Boot应用中配置密码加密和JWT认证的基本步骤。首先,我们定义了一个PasswordEncoder的Bean,并在其中使用了BCrypt加密方式。然后,我们覆盖了configure(AuthenticationManagerBuilder auth)方法来配置内存中的用户详情服务,并使用了我们定义的密码加密方式。最后,在configure(HttpSecurity http)方法中,我们禁用了CSRF保护并添加了JWT认证入口点和JwtAuthenticationFilter。

2024-09-03



# 拉取官方PostgreSQL镜像
docker pull postgres
 
# 创建并启动PostgreSQL容器,同时设置环境变量和持久化数据
docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d \
    -v /my/local/path:/var/lib/postgresql/data \
    postgres

在这个例子中,我们首先从Docker Hub拉取了官方的PostgreSQL镜像。然后,我们使用docker run命令创建并启动了一个名为some-postgres的PostgreSQL容器。我们通过-e设置了环境变量POSTGRES_PASSWORD,这是PostgreSQL容器内部用来创建postgres用户密码的环境变量。-d参数表示以守护进程模式运行容器。最后,我们使用-v参数将本地路径/my/local/path挂载到容器内的/var/lib/postgresql/data路径,这样可以持久化PostgreSQL的数据。

2024-09-03

要修改Oracle数据库的默认端口1521,您需要执行以下步骤:

  1. 修改监听器配置
  2. 重新启动监听器

以下是具体的操作步骤和示例:

  1. 使用SQL*Plus或其他Oracle数据库客户端连接到数据库。
  2. 登录到数据库后,执行以下命令来修改监听器配置,将new_port替换为您想要的新端口号,例如1531



BEGIN
  DBMS_XDB.SETHTTPPORT(new_port => 1531);
END;
/

如果您需要修改的是其他类型的端口,可能需要使用其他相关的DBMS包,如DBMS_AQADM.SET_PORT等。

  1. 修改tnsnames.ora和listener.ora文件,这两个文件通常位于$ORACLE_HOME/network/admin目录下。

    • 修改tnsnames.ora文件中相关的网络服务条目,将端口号从1521改为新端口号,例如:
    
    
    
    MYDB =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = your_host)(PORT = 1531))
        (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = your_service_name)
        )
      )
    • 修改listener.ora文件,将监听器的端口从1521改为新端口号,例如:
    
    
    
    LISTENER =
      (DESCRIPTION_LIST =
        (DESCRIPTION =
          (ADDRESS = (PROTOCOL = TCP)(HOST = your_host)(PORT = 1531))
        )
      )
  2. 重新启动监听器以使配置生效。在命令行中执行以下命令:



lsnrctl stop
lsnrctl start

请确保在修改配置文件和重启监听器之前备份原始文件,并在数据库正常运行的情况下进行操作。如果您不熟悉这些步骤,建议咨询数据库管理员或者Oracle支持专家。

2024-09-03



-- 创建pgvector类型的扩展
CREATE EXTENSION IF NOT EXISTS pgvector;
 
-- 创建一个存储文档向量的表
CREATE TABLE doc_vectors (
    doc_id INT PRIMARY KEY,
    vector pgvector
);
 
-- 插入文档向量数据
INSERT INTO doc_vectors (doc_id, vector) VALUES
(1, 'a,b,c'::pgvector),
(2, 'b,c,d'::pgvector),
(3, 'a,b,d'::pgvector);
 
-- 查询与特定文档向量最相似的文档
SELECT doc_id, vector_similarity(vector, 'a,b,c'::pgvector) AS similarity
FROM doc_vectors
ORDER BY similarity DESC
LIMIT 1;

这个简单的例子展示了如何在IvorySQL中使用pgvector扩展来存储和查询文档向量。首先,我们创建了pgvector类型的扩展(如果尚未创建)。接着,我们创建了一个包含文档ID和向量的表,并插入了几个示例向量。最后,我们查询了与特定向量最相似的文档。这个例子演示了如何使用pgvector进行基本的向量相似度查询,这在处理例如推荐系统中的相似性查询时非常有用。

2024-09-03

Spring Boot的自动配置是一种让你快速开始开发的方式,它会根据类路径上的jar依赖自动配置Spring应用程序。Spring Boot的自动配置是通过@EnableAutoConfiguration注解触发的,它会查找classpath下的配置文件(META-INF/spring.factories),并根据文件中的配置自动配置Bean。

要创建自己的自动配置,你需要做以下几步:

  1. 创建一个带有@Configuration注解的配置类。
  2. 使用@Conditional注解(或其派生注解,如@ConditionalOnClass@ConditionalOnMissingBean等)来指定在何种条件下应用该配置。
  3. 使用@Bean注解来声明需要自动配置的Bean。
  4. spring.factories文件中指定自动配置类。

下面是一个简单的自动配置示例:




// MyAutoConfiguration.java
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
@Configuration
@ConditionalOnClass(MyClass.class) // 仅当MyClass在classpath上时,才会自动配置以下Bean
public class MyAutoConfiguration {
 
    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}

然后,在META-INF/spring.factories文件中添加以下行:




org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.example.MyAutoConfiguration

这样,只要MyClass类在classpath上,MyAutoConfiguration中定义的myBean方法就会被调用,并创建相应的Bean。

2024-09-03

在MongoDB中,正则表达式用于查询包含或匹配指定模式的文档。下面是一些常用的正则表达式操作符和示例:

  1. $regex: 用于指定正则表达式。



// 查询name字段包含"john"的文档
db.collection.find({ "name": { "$regex": "john" } });
  1. i选项: 使匹配操作不区分大小写。



// 查询name字段包含"john"或"JOHN"的文档
db.collection.find({ "name": { "$regex": "john", "$options": "i" } });
  1. m选项: 多行匹配,^$操作符将应用于每一行而不是整个字符串。



// 查询name字段以"john"开头的文档
db.collection.find({ "name": { "$regex": "^john", "$options": "m" } });
  1. x选项: 忽略正则表达式中的空白字符。



// 查询name字段包含"john"的文档,忽略正则表达式中的空格
db.collection.find({ "name": { "$regex": " j o h n ", "$options": "x" } });
  1. 正则表达式操作符: 如.匹配任何单个字符,*匹配前面的字符0次或多次。



// 查询name字段以"jo"开头,以"n"结尾的文档
db.collection.find({ "name": { "$regex": "^jo.*n$", "$options": "" } });

使用正则表达式可以实现复杂的模式匹配,从而有效地查询和处理MongoDB中的数据。

2024-09-03

要在openEuler上离线安装pgpool+pg+gis实现高可用性,你需要遵循以下步骤:

  1. 在有网络连接的环境中下载pgpool和PostgreSQL GIS的rpm包以及它们的依赖。
  2. 将下载的rpm包复制到openEuler系统中。
  3. 使用rpm命令在离线环境中安装pgpool和PostgreSQL GIS。
  4. 配置pgpool以实现高可用性。

以下是一个简化的步骤示例:

  1. 在有网络的机器上下载pgpool和pg的rpm包:



# 示例下载命令,请根据实际情况下载正确的版本
wget https://mirrors.aliyun.com/openeuler/openEuler-20.03-LTS/everything/aarch64/os/Packages/p/pgpool-II-pgpool-II-42.2.2-1.oe2003.aarch64.rpm
  1. 同时,下载PostgreSQL和PostGIS的rpm包。
  2. 将下载的rpm包复制到openEuler系统中,可以使用USB驱动器或其他媒体。
  3. 在openEuler系统上,使用rpm命令安装rpm包:



sudo rpm -Uvh /path/to/pgpool-II-*.rpm
sudo rpm -Uvh /path/to/postgresql-*.rpm
sudo rpm -Uvh /path/to/postgis-*.rpm
  1. 配置pgpool。编辑pgpool.conf和其他相关配置文件,设置适当的复制、连接池和健康检查参数。
  2. 配置PostgreSQL,包括复制槽、流复制和其他高可用性特性。
  3. 启动pgpool和PostgreSQL服务:



sudo systemctl start pgpool
sudo systemctl start postgresql

请注意,你需要确保所有依赖项都满足,并且你已经下载了所有必需的rpm包。如果有缺失的依赖,你需要在有网络的环境中找到并下载这些依赖,然后一并安装。

2024-09-03

@Column 注解在 Java 中被用于定义或修饰持久层的属性。在 Spring Boot 中,它通常与 JPA (Java Persistence API) 一起使用,用于定义实体类与数据库表之间的映射关系。

以下是 @Column 注解的几个常用属性:

  • name:列名。定义了数据库表中该字段的名称。
  • unique:是否唯一。定义了该字段是否有唯一约束。
  • nullable:是否可为空。定义了该字段是否可以存储 NULL 值。
  • length:列长度。定义了该字段的长度,比如 VARCHAR 类型的长度。
  • insertable:是否可插入。定义了该字段是否可以在 INSERT 语句中使用。
  • updatable:是否可更新。定义了该字段是否可以在 UPDATE 语句中使用。
  • columnDefinition:定义创建列时使用的 SQL 片段。
  • table:指定该字段所在的数据库表名。

下面是一个使用 @Column 注解的简单实例:




import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
 
@Entity
@Table(name = "users")
public class User {
    @Id
    private Long id;
 
    @Column(name = "username", unique = true, nullable = false, length = 50)
    private String username;
 
    @Column(name = "email", nullable = false, length = 100)
    private String email;
 
    // 省略 getter 和 setter 方法
}

在这个例子中,User 实体类映射到数据库中的 users 表。usernameemail 字段都有相应的 @Column 注解定义,指定了字段的名称、是否唯一、是否可为空以及长度。

2024-09-03

交叉编译SQLite通常涉及到使用一个主机系统(运行编译工具链的系统)来编译将在目标系统上运行的软件。以下是一个基本的步骤指南和示例Makefile,用于交叉编译SQLite:

  1. 确保你有交叉编译工具链安装在你的主机上。
  2. 下载SQLite的源代码。
  3. 创建或编辑Makefile来指定交叉编译工具链和目标系统的相关配置。

以下是一个简单的Makefile示例,用于交叉编译SQLite:




# 设置交叉编译工具链前缀
CC = arm-linux-gnueabihf-gcc
STRIP = arm-linux-gnueabihf-strip
 
# 设置SQLite版本和配置选项
SQLITE_VERSION = 3360000
CFLAGS = -DSQLITE_ENABLE_FTS3 \
         -DSQLITE_ENABLE_FTS4 \
         -DSQLITE_ENABLE_FTS5 \
         -DSQLITE_ENABLE_JSON1 \
         -DSQLITE_ENABLE_RTREE \
         -DSQLITE_ENABLE_GEOPOLY \
         -DSQLITE_ENABLE_MATRIX_ALGEBRA \
         -DSQLITE_ENABLE_COLUMN_METADATA \
         -DSQLITE_SECURE_DELETE \
         -DSQLITE_ENABLE_UNLOCK_NOTIFY \
         -DSQLITE_ENABLE_DBSTAT_VTAB \
         -DSQLITE_CORE \
         -DSQLITE_ENABLE_LOCKING_STYLE=0 \
         -DSQLITE_THREADSAFE=2 \
         -DSQLITE_TEMP_STORE=3 \
         -DSQLITE_USE_URI \
         -DSQLITE_SOUNDEX \
         -DSQLITE_ENABLE_DESERIALIZE \
         -DSQLITE_MAX_ATTACHED=10 \
         -DSQLITE_MAX_TRIGGER_DEPTH=1000 \
         -Os -fPIC
 
# 编译目标
all: sqlite3
 
# 清理目标
clean:
    rm -f sqlite3 sqlite3.o sqlite3.c
 
sqlite3: sqlite3.o
    $(CC) -o $@ $^ $(STRIP)
 
sqlite3.o: sqlite3.c
    $(CC) -c $(CFLAGS) $< -o $@
 
# 下载SQLite源码
sqlitedep:
    wget https://www.sqlite.org/2023/sqlite-autoconf-$(SQLITE_VERSION).tar.gz
    tar -xzf sqlite-autoconf-$(SQLITE_VERSION).tar.gz
    rm sqlite-autoconf-$(SQLITE_VERSION).tar.gz

在这个Makefile中,你需要根据你的目标系统和工具链进行相应的调整。例如,CC变量需要设置为你的交叉编译器前缀,CFLAGS变量需要包含你希望启用的SQLite配置选项。

要编译SQLite,请执行以下步骤:

  1. 将此Makefile保存到一个新目录中,并将其命名为Makefile
  2. 在同一目录下运行make sqlitedep来下载SQLite源码。
  3. 运行make来编译SQLite。

这将会下载并编译SQLite,生成一个优化过的、静态链接的sqlite3可执行文件,并使用arm-linux-gnueabihf-strip工具来去除符号信息,以减小最终的可执行文件大小。

2024-09-03

在Spring Cloud环境中使用Sa-Token和Redis进行登录验证,你需要做以下几步:

  1. 引入相关依赖:



<!-- Sa-Token 依赖 -->
<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-spring-boot-starter</artifactId>
    <version>你的版本号</version>
</dependency>
<!-- Redis 依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. 配置Sa-Token和Redis:



# Sa-Token 配置
sa-token:
  token-name: Authorization
  timeout: 2592000 # 过期时间,单位秒
  activity-timeout: -1 # 活跃认证时间(-1代表永不过期)
  is-concurrent: false # 是否允许同一账号并发登录(为true时允许一起登录,为false时新登录把其他登录Kick下线)
  header: Authorization # 请求头header名称
  token-prefix: satoken:login: # 令牌前缀
  # Redis 配置
spring:
  redis:
    host: 你的Redis地址
    port: 6379
    password: 你的Redis密码
    database: 0
    timeout: 6000
  1. 配置Sa-Token与Spring Cloud集成:



@Configuration
public class SaTokenConfig {
    @Bean
    public SaTokenInterceptor getSaTokenInterceptor() {
        return new SaTokenInterceptor();
    }
}
  1. 创建登录接口并使用Sa-Token提供的API进行验证:



@RestController
public class LoginController {
 
    @Autowired
    private SaTokenService saTokenService;
 
    @PostMapping("/login")
    public ResponseEntity<?> login(@RequestParam("username") String username, @RequestParam("password") String password) {
        // 这里的逻辑应该是校验用户名密码是否正确,正确则登录成功
        // 登录成功后使用Sa-Token提供的API创建token
        StpUtil.login(username, password);
        return ResponseEntity.ok("登录成功");
    }
 
    @GetMapping("/logout")
    public ResponseEntity<?> logout() {
        // 登出当前会话
        StpUtil.logout();
        return ResponseEntity.ok("登出成功");
    }
 
    // 其他接口可以使用Sa-Token提供的拦截器自动检查登录状态
}
  1. 其他需要验证登录的接口,可以使用Sa-Token提供的拦截器自动检查登录状态:



@RestController
@RequestMapping("/user")
public class UserController {
 
    // 这里的方法在没有登录或者token失效时会返回401错误
 
}

以上代码提供了一个简单的登录接口和登出接口,并展示了如何在Spring Cloud环境中使用Sa-Token和Redis进行登录验证。在实际应用中,你需要根据自己的业务需求进行相应的逻辑扩展和错误处理。