java实现@功能,给与被@人提示,并保存至数据库供再次展示的代码实例
时间: 2024-03-16 10:42:09 浏览: 50
可以在java中有提示功能
下面是一个使用 `Java` 实现 `@` 功能,并且保存至数据库供再次展示的示例代码。
首先,假设我们有一个 `User` 实体类,其中包含用户的一些基本信息,比如 `name`、`email` 等属性。
```java
public class User {
private Long id;
private String name;
private String email;
// 省略 getter 和 setter 方法
}
```
然后,我们需要在数据库中创建一张 `message` 表,用于存储用户的消息。该表至少需要包含 `id`、`content`、`sender_id`、`receiver_id` 和 `created_at` 等字段。其中,`sender_id` 和 `receiver_id` 分别表示消息的发送者和接收者。
```sql
CREATE TABLE message (
id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
content TEXT NOT NULL,
sender_id BIGINT(20) UNSIGNED NOT NULL,
receiver_id BIGINT(20) UNSIGNED NOT NULL,
created_at DATETIME NOT NULL,
PRIMARY KEY (id)
);
```
接下来,我们可以通过以下步骤实现 `@` 功能:
1. 监听消息输入框的输入事件,在用户输入时判断是否输入了 `@` 符号。
2. 如果输入了 `@` 符号,则弹出一个下拉框,显示所有可选的用户列表(可以从数据库中查询)。
3. 当用户选择一个用户时,将其添加到消息输入框中,并提示被 `@` 的用户。
4. 在消息发送时,将消息内容保存至数据库,并在前端展示时将 `@` 提示的用户名字转化为链接。
下面是一个示例代码,仅供参考:
```java
@RestController
@RequestMapping("/messages")
public class MessageController {
@Autowired
private MessageService messageService;
@Autowired
private UserService userService;
@PostMapping("")
public void createMessage(@RequestBody MessageDto messageDto) {
// 保存消息至数据库
Message message = new Message();
message.setContent(messageDto.getContent());
message.setSenderId(messageDto.getSenderId());
message.setReceiverId(messageDto.getReceiverId());
message.setCreatedAt(LocalDateTime.now());
messageService.saveMessage(message);
}
@GetMapping("/users")
public List<User> getAllUsers() {
// 获取所有用户列表
return userService.getAllUsers();
}
}
```
```java
@Service
public class MessageService {
@Autowired
private MessageRepository messageRepository;
public void saveMessage(Message message) {
messageRepository.save(message);
}
}
```
```java
@Repository
public interface MessageRepository extends JpaRepository<Message, Long> {
}
```
```java
public class MessageDto {
private String content;
private Long senderId;
private Long receiverId;
// 省略 getter 和 setter 方法
}
```
```html
<template>
<div>
<label for="input">输入框:</label>
<input id="input" type="text" v-model="content" @input="handleInput"/>
<div v-if="showDropdown" class="dropdown">
<ul>
<li v-for="(user, index) in users" :key="index" @click="handleUserClick(user)">
{{ user.name }}
</li>
</ul>
</div>
<div v-html="formattedContent"></div>
</div>
</template>
<script>
import axios from 'axios';
export default {
data() {
return {
content: '',
showDropdown: false,
users: [],
atUsers: []
}
},
computed: {
formattedContent() {
let formatted = this.content;
for (let user of this.atUsers) {
formatted = formatted.replace(`@${user.name}`, `<a href="/users/${user.id}">@${user.name}</a>`);
}
return formatted;
}
},
methods: {
handleInput() {
if (this.content.endsWith('@')) {
this.showDropdown = true;
axios.get('/messages/users')
.then(response => {
this.users = response.data;
});
} else {
this.showDropdown = false;
}
},
handleUserClick(user) {
this.content = this.content.slice(0, -1) + `@${user.name} `;
this.showDropdown = false;
this.atUsers.push(user);
},
sendMessage() {
axios.post('/messages', {
content: this.content,
senderId: 1,
receiverId: 2
}).then(response => {
this.content = '';
this.atUsers = [];
});
}
}
}
</script>
```
在上面的代码中,我们通过 `atUsers` 数组来保存所有被 `@` 的用户,在发送消息时将其一并保存至数据库中。在前端展示时,我们使用 `v-html` 指令将消息内容中的 `@` 用户转化为链接。注意,这种做法可能存在安全隐患,因此需要进行输入过滤和转义。
阅读全文