繁体   English   中英

如何添加发送消息的时间(Spring Boot 和 MySQL)

[英]How can I add the time of sending a message (Spring Boot and MySQL)

如何添加向数据库(MySQL)和程序发送消息的时间。 我通过 Vaadin 14 UI 框架创建了一个界面。 我通过浏览器启动它,我有一个聊天,几个人可以在那里交流。 他们的消息存储在数据库中。 现在您需要添加用户发送消息的时间。 我确定数据库保存了用户和他的消息,但我无法添加发送消息的时间

休息控制器

@SpringComponent
@org.springframework.web.bind.annotation.RestController
public class RestController {
    private List<Message> store;

    public RestController() {
        store = new ArrayList<>();
    }

    @PutMapping("/api/save")
    public void saveMessage(@RequestBody String chatMessage) {
        store.add(new Gson().fromJson(chatMessage, Message.class));

        if (store.size() > 10)
            store.remove(0);
    }

    @GetMapping("/api/last")
    public String getLasts() {
        return new Gson().toJson(store);
    }
}

留言类

@Entity
@Table(name = "chatMessages")
public class Message {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private long id;

  private String fromV;
  private String messageV;

  public Message() { }

  public Message(String from, String message) {
    this.fromV = from;
    this.messageV = message;
  }

  public long getId() {
    return id;
  }

  public void setId(long id) {
    this.id = id;
  }

  public String getFrom() {
    return fromV;
  }

  public void setFrom(String from) {
    this.fromV = from;
  }

  public String getMessage() {
    return messageV;
  }

  public void setMessage(String message) {
    this.messageV = message;
  }
}

休息服务

@SpringComponent
@Service
public class RestService {
    private final RestTemplate restTemplate;
    private final MessageService messageService;

    public RestService(RestTemplateBuilder restTemplateBuilder,
                       MessageService messageService) {
        this.restTemplate = restTemplateBuilder.build();
        this.messageService = messageService;
    }

    public void saveMessage(Message message)
    {
        String url = "http://localhost:8080/api/save";

        this.restTemplate.put(url, new Gson().toJson(message));
        this.messageService.add(new Message(message.getFrom(), message.getMessage()));
    }

    public List<Message> getLast() {
        String url = "http://localhost:8080/api/last";

        String json = restTemplate.getForObject(url, String.class);
        return new Gson().fromJson(json, new TypeToken<List<Message>>(){}.getType());
    }
}

主视图

@StyleSheet("frontend://styles/styles.css")
@Route
@PWA(name = "Vaadin Chat", shortName = "Vaadin Chat")
@Push
public class MainView extends VerticalLayout {
  private final UnicastProcessor<Message> publisher;
  private final Flux<Message> messages;
  private String username;

  @Autowired
  private RestService restService;

  public MainView(UnicastProcessor<Message> publisher,
                  Flux<Message> messages) {
    this.publisher = publisher;
    this.messages = messages;

    addClassName("main-view");
    setSizeFull();
    setDefaultHorizontalComponentAlignment(Alignment.CENTER);

    H1 header = new H1("Vaadin Chat");
    header.getElement().getThemeList().add("dark");

    add(header); 

    askUsername();
  }


  private void askUsername() {
    HorizontalLayout layout = new HorizontalLayout();
    TextField usernameField = new TextField();
    Button startButton = new Button("Start chat");

    layout.add(usernameField, startButton);

    startButton.addClickListener(click -> {
      username = usernameField.getValue();
      remove(layout);
      showChat();
    });

    add(layout);
  }

  private void showChat() {
    MessageList messageList = new MessageList();

    add(messageList, createInputLayout());
    expand(messageList);

    List<Message> lasts = restService.getLast();
    for (Message message : lasts)
      messageList.add(new Paragraph(message.getFrom() + ": " + message.getMessage()));

    messages.subscribe(message -> {
      getUI().ifPresent(ui ->
          ui.access(() ->
              messageList.add(
                  new Paragraph(message.getFrom() + ": " +
                      message.getMessage())
              )
          ));
    });
  }

  private Component createInputLayout() {
    HorizontalLayout layout = new HorizontalLayout();
    layout.setWidth("100%");

    TextField messageField = new TextField();
    messageField.addKeyDownListener(Key.ENTER, keyDownEvent -> sender(messageField));
    Button sendButton = new Button("Send");
    sendButton.addThemeVariants(ButtonVariant.LUMO_PRIMARY);

    layout.add(messageField, sendButton);
    layout.expand(messageField);

    sendButton.addClickListener(click -> sender(messageField));
    messageField.focus();

    return layout;
  }
 private void sender(TextField textField) {
    Message message = new Message(username, textField.getValue());
    publisher.onNext(message);
    restService.saveMessage(message);
    textField.clear();
    textField.focus();
  }
}

让 Spring 为您管理时间戳和用户名,因为您已经在使用 Spring Boot。

https://docs.spring.io/spring-data/jpa/docs/2.2.x/reference/html/#auditing

class Message {

  @CreatedBy
  private User user;

  @CreatedDate
  private DateTime createdDate;
}

你的message类应该是这样的:

 @Entity
 @Table(name = "chatMessages")
 @Data
 public class Message {
      @Id
      @GeneratedValue(strategy = GenerationType.IDENTITY)
      private long id;

      private String fromV;
      private String messageV;
      private Timestamp sendTime;

在您的RestService类中:

public void saveMessage(Message message)
    {
        String url = "http://localhost:8080/api/save";
        message.setsendTime(new Timestamp(new Date().getTime()));
        this.restTemplate.put(url, new Gson().toJson(message));
        this.messageService.add(new Message(message.getFrom(), message.getMessage()));
    }

我希望这会有所帮助:)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM