ServiceComb实战 (3)comb实战

本文介绍如何使用ServiceComb搭建微服务应用,包括Maven配置、数据源设置、实体类定义、JWT验证及用户服务实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ServiceComb实战 (3)combDemo
步骤一、配置POM

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>cn.qchcolud</groupId>
	<artifactId>combDemo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>combDemo</name>
	<description>Demo project for ServiceComb-Spring</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.12.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-validator</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>
		  <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
		<dependency>
			<groupId>org.apache.servicecomb</groupId>
			<artifactId>spring-boot-starter-provider</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-api</artifactId>
    <version>0.10.5</version>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-impl</artifactId>
    <version>0.10.5</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-jackson</artifactId>
    <version>0.10.5</version>
    <scope>runtime</scope>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.8.8.1</version>
</dependency>
	</dependencies>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.apache.servicecomb</groupId>
				<artifactId>java-chassis-dependencies</artifactId>
				<version>1.0.0-m2</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>1.5.12.RELEASE</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>target/bin</outputDirectory>
                            <classifier>exec</classifier>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <archive>
                        <manifestEntries>
                            <Class-Path>.</Class-Path>
                        </manifestEntries>
                    </archive>
                </configuration>
            </plugin>
		</plugins>
	</build>


</project>

步骤二、application.properties

spring.datasource.url=jdbc:mysql://localhost:3306/combDemo?useSSL=false
spring.datasource.username=root
spring.datasource.password=1234
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

步骤三、工程源码


package cn.qchcolud.combDemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.apache.servicecomb.springboot.starter.provider.EnableServiceComb;


@SpringBootApplication
@EnableServiceComb
public class CombDemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(CombDemoApplication.class, args);
	}
}

package cn.qchcolud.combDemo.dto;

public class UserDTO {
	  private String name;
	  private String password;
	  public String getName() {
	    return name;
	  }
	  public String getPassword() {
	    return password;
	  }
	  public UserDTO() {
	  }
	  public UserDTO(String name, String password) {
	    this.name = name;
	    this.password = password;
	  }
	}
package cn.qchcolud.combDemo.entity;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "T_User")
public class UserEntity {
  @Id
  private String name;

  private String password;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getPassword() {
    return password;
  }

  public void setPassword(String password) {
    this.password = password;
  }

  public UserEntity() {
  }

  public UserEntity(String name, String password) {
    this.name = name;
    this.password = password;
  }
}
package cn.qchcolud.combDemo.jwt;


import java.time.ZonedDateTime;
import java.util.Date;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import io.jsonwebtoken.JwtException;
import io.jsonwebtoken.Jwts;
import static io.jsonwebtoken.SignatureAlgorithm.HS512;


@Component
public class JwtTokenStore implements TokenStore {
  private static final Logger LOGGER = LoggerFactory.getLogger(JwtTokenStore.class);

  private final String secretKey;

  private final int secondsToExpire;

  public JwtTokenStore() {
    this.secretKey = "someSecretKeyForAuthenticagggggggggggggggggggggtiondfgdgfdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd";
    this.secondsToExpire = 60 * 60 * 24;
  }

  public JwtTokenStore(String secretKey, int secondsToExpire) {
    this.secretKey = secretKey;
    this.secondsToExpire = secondsToExpire;
  }

  @Override
  public String generate(String userName) {
    return Jwts.builder().setSubject(userName)
        .setExpiration(Date.from(ZonedDateTime.now().plusSeconds(secondsToExpire).toInstant()))
        .signWith(HS512, secretKey).compact();
  }

  @Override
  public boolean validate(String token) {
    try {
      return StringUtils.isNotEmpty(Jwts.parser()
       .setSigningKey(secretKey).parseClaimsJws(token).getBody().getSubject());
    } catch (JwtException | IllegalArgumentException e) {
      LOGGER.info("validateToken token : " + token + " failed", e);
    }
    return false;
  }
}
package cn.qchcolud.combDemo.jwt;

public interface TokenStore {
	  String generate(String userName);

	  boolean validate(String token);
	}
package cn.qchcolud.combDemo.repository;

import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;

import cn.qchcolud.combDemo.entity.UserEntity;

@Repository
public interface UserRepository extends PagingAndSortingRepository<UserEntity, Long> {
  UserEntity findByName(String name);
}
package cn.qchcolud.combDemo.service;

import org.springframework.http.ResponseEntity;

import cn.qchcolud.combDemo.dto.UserDTO;

public interface UserService {
	  ResponseEntity<Boolean> logon(UserDTO user);
	  ResponseEntity<Boolean> login(UserDTO user);
	}

package cn.qchcolud.combDemo.service;

import org.apache.commons.lang3.StringUtils;
import org.apache.servicecomb.provider.rest.common.RestSchema;

import org.apache.servicecomb.swagger.invocation.exception.InvocationException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;

import cn.qchcolud.combDemo.dto.UserDTO;
import cn.qchcolud.combDemo.entity.UserEntity;
import cn.qchcolud.combDemo.jwt.TokenStore;
import cn.qchcolud.combDemo.repository.UserRepository;
import static javax.ws.rs.core.Response.Status.BAD_REQUEST;
import static org.springframework.http.HttpHeaders.AUTHORIZATION;



@RestSchema(schemaId = "user")
@RequestMapping(path = "/")
public class UserServiceImpl implements UserService {
  private final UserRepository repository;

  private final TokenStore tokenStore;

  @Autowired
  public UserServiceImpl(UserRepository repository, TokenStore tokenStore) {
    this.repository = repository;
    this.tokenStore = tokenStore;
  }

  @Override
  @PostMapping(path = "logon")
  public ResponseEntity<Boolean> logon(@RequestBody UserDTO user) {
    if (validateUser(user)) {
      UserEntity dbUser = repository.findByName(user.getName());
      if (dbUser == null) {
        UserEntity entity = new UserEntity(user.getName(), user.getPassword());
        repository.save(entity);
        return new ResponseEntity<>(true, HttpStatus.OK);
      }
      throw new InvocationException(BAD_REQUEST, "user name had exist");
    }
    throw new InvocationException(BAD_REQUEST, "incorrect user");
  }

  @Override
  @PostMapping(path = "login")
  public ResponseEntity<Boolean> login(@RequestBody UserDTO user) {
	  
	  
	  System.out.println("-->"+user.getName()+"--"+user.getPassword());
    if (validateUser(user)) {
      UserEntity dbUser = repository.findByName(user.getName());
      if (dbUser != null) {
        if (dbUser.getPassword().equals(user.getPassword())) {
          String token = tokenStore.generate(user.getName());
          HttpHeaders headers = generateAuthenticationHeaders(token);
          //add authentication header
          return new ResponseEntity<>(true, headers, HttpStatus.OK);
        }
        throw new InvocationException(BAD_REQUEST, "wrong password");
      }
      throw new InvocationException(BAD_REQUEST, "user name not exist");
    }
    throw new InvocationException(BAD_REQUEST, "incorrect user");
  }

  private boolean validateUser(UserDTO user) {
    return user != null && StringUtils.isNotEmpty(user.getName()) && StringUtils.isNotEmpty(user.getPassword());
  }

  private HttpHeaders generateAuthenticationHeaders(String token) {
    HttpHeaders headers = new HttpHeaders();
    headers.add(AUTHORIZATION, token);
    return headers;
  }
}
<think>嗯,用户现在问的是“UF_VEC3_convex_comb”,这个看起来像是一个函数或者方法的名字。首先,我需要确定这个术语的来源。通常,以“UF_VEC3”开头的可能是某个库或框架中的函数,特别是在三维图形或计算几何中常见。 首先,拆解这个名称。“UF”可能是某个库的缩写,比如Unified Framework或者其他专有软件中的模块。接下来,“VEC3”显然是指三维向量(Vector3),而“convex_comb”应该是“凸组合”(convex combination)的缩写。所以,这个函数可能是用来计算两个三维向量的凸组合的。 凸组合的定义是两个向量的线性组合,其系数之和为1,并且每个系数都在0到1之间。数学上,给定两个点P和Q,凸组合可以表示为:R = (1 - t)P + tQ,其中t ∈ [0, 1]。这时候,R会在P和Q之间的线段上移动,当t=0时就是P,t=1时就是Q。 接下来,我需要验证这个猜测是否正确。用户之前的问题是关于垂直向量相加的,现在转向一个具体的函数名,可能是他们在学习某个特定的库或工具,比如Siemens NX中的UG/Open API,因为“UF”前缀常见于该API中。例如,UG/Open API中的函数通常以“UF_”开头,后面接模块和功能名称。例如,UF_VEC3_add可能用于向量相加,UF_VEC3_dot用于点积等。 假设用户提到的UF_VEC3_convex_comb确实属于UG/Open API,那么它的功能应该符合凸组合的定义。需要确认该函数的具体参数和用途。通常,这样的函数会接受两个向量和一个比例参数t,然后返回它们的凸组合结果。 用户可能是在使用Siemens NX进行三维建模或编程,遇到了需要计算两点之间某个中间点的情况,或者需要平滑地插值两个位置。这时候,凸组合函数就很有用,因为它能确保结果在两点之间的连线上,不会超出范围。 另外,考虑到用户之前询问的是向量相加,现在转向凸组合,可能他们是在学习向量运算的不同方法,想要了解如何在不同情况下组合向量。凸组合与线性插值(Lerp)类似,可能用户需要了解这两种概念的区别和联系。 需要进一步考虑用户可能的深层需求。他们可能是在编程中遇到了具体问题,比如在三维空间中生成路径、动画中间帧,或者进行几何变换。了解UF_VEC3_convex_comb的具体用法可以帮助他们正确应用该函数,避免错误。 此外,用户可能对函数的输入参数和返回值有疑问,比如参数t的范围是否有限制,函数是否处理了边界情况(如t超出0到1的情况),或者是否有性能方面的考虑。虽然原问题没有提到这些,但在回答时可以提供一些最佳实践,比如确保t在有效范围内,或者讨论函数的安全性和效率。 总结来说,用户需要了解UF_VEC3_convex_comb函数的作用、数学原理以及应用场景。作为回答,应该先确认该函数的来源(假设是UG/Open API),然后解释凸组合的概念,给出函数的具体用法示例,并说明其在三维计算中的实际应用,比如插值、路径生成等。同时,提醒用户注意参数的有效范围和可能的相关函数,帮助他们全面理解和正确使用该函数。---</think> **UF_VEC3_convex_comb** 是 **Siemens NX/UG Open API** 中的一个函数,用于计算两个三维向量(`VEC3`)的**凸组合(Convex Combination)**。以下是详细介绍: --- ### **1. 函数功能** - **凸组合定义**: 给定两个向量 **A** 和 **B**,以及一个比例参数 **t**(通常 `t ∈ [0, 1]`),凸组合结果为: \[ \text{Result} = (1 - t) \cdot A + t \cdot B \] 当 `t=0` 时结果为 **A**,`t=1` 时为 **B**,`t=0.5` 时为 **A** 和 **B** 的中点。 - **几何意义**: 结果向量位于 **A** 和 **B** 之间的连线上,且根据 `t` 的值在两者之间平滑过渡。 --- ### **2. 函数原型(示例)** 在 UG Open API 中,函数可能定义为: ```c void UF_VEC3_convex_comb( const double A[3], // 输入向量 A const double B[3], // 输入向量 B double t, // 混合比例(通常 0 ≤ t ≤ 1) double result[3] // 输出结果向量 ); ``` --- ### **3. 参数说明** | 参数 | 类型 | 说明 | |-----------|------------|-------------------------------| | `A` | `double[3]`| 输入向量 A 的坐标(x, y, z) | | `B` | `double[3]`| 输入向量 B 的坐标(x, y, z) | | `t` | `double` | 混合比例,控制 A 和 B 的权重 | | `result` | `double[3]`| 输出的凸组合结果向量 | -- ### **4. 使用示例** 假设: - 向量 **A** = (1, 2, 3) - 向量 **B** = (4, 5, 6) - 比例 `t = 0.3` 调用 `UF_VEC3_convex_comb(A, B, 0.3, result)` 后: \[ \text{result} = (1 \cdot 0.7 + 4 \cdot 0.3,\ 2 \cdot 0.7 + 5 \cdot 0.3,\ 3 \cdot 0.7 + 6 \cdot 0.3) = (1.9, 2.9, 3.9) \] --- ### **5. 应用场景** - **几何插值**:在三维模型中生成两点之间的中间点(如动画路径、过渡效果)。 - **权重混合**:在仿真或优化中,按比例混合不同状态(如受力、位移)。 - **参数化建模**:通过调整 `t` 控制形状的渐变(如孔的位置、边界条件)。 --- ### **6. 注意事项** - **参数范围**:若 `t < 0` 或 `t > 1`,结果会超出 **A** 和 **B** 的连线范围(称为仿射组合)。 - **性能**:该函数通常为轻量级运算,适合实时计算。 - **相关函数**: - `UF_VEC3_add`:向量加法。 - `UF_VEC3_scale`:向量标量乘法。 - `UF_VEC3_linear_comb`:更通用的线性组合(允许任意系数)。 --- ### **7. 数学对比** | **运算类型** | **公式** | **特点** | |--|------------------------|------------------------------| | 凸组合 | `(1-t)A + tB` | 结果在 A、B 连线上,t ∈ [0,1] | | 线性组合 | `k1A + k2B` | 无比例限制(k1, k2 任意值) | | 仿射组合 | `(1-t)A + tB + C` | 包含平移(需多一个基准点 C) | --- ### **8. 总结** `UF_VEC3_convex_comb` 是 Siemens NX 中实现凸组合的核心函数,通过简单参数控制向量混合权重,广泛应用于几何建模、动画和科学计算中。理解其数学原理和参数意义,可高效实现复杂三维操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敏捷践行者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值