Browse Source

Merge branch 'master' of http://110.90.118.129:3000/La123123./im-backed

# Conflicts:
#	im-platform/src/main/java/com/bx/implatform/service/impl/UserServiceImpl.java
#	im-uniapp/pages/login/login.vue
master
[yxf] 2 days ago
parent
commit
88cb4042bd
  1. 3
      im-platform/src/main/java/com/bx/implatform/dto/LoginDTO.java
  2. 10
      im-platform/src/main/java/com/bx/implatform/entity/User.java
  3. 7
      im-platform/src/main/java/com/bx/implatform/service/UserService.java
  4. 39
      im-platform/src/main/java/com/bx/implatform/service/impl/UserServiceImpl.java
  5. 75
      im-platform/src/main/java/com/bx/implatform/util/IpUtils.java
  6. 94
      im-uniapp/pages/login/login.vue

3
im-platform/src/main/java/com/bx/implatform/dto/LoginDTO.java

@ -25,4 +25,7 @@ public class LoginDTO {
@Schema(description = "用户密码")
private String password;
@Schema(description = "ip地址")
private String ip;
}

10
im-platform/src/main/java/com/bx/implatform/entity/User.java

@ -94,4 +94,14 @@ public class User {
*/
private Integer isCustomer = 1;
/**
* 最后登录ip
*/
private String lastLoginIp;
/**
* ip转换的地址
*/
private String ipAddress;
}

7
im-platform/src/main/java/com/bx/implatform/service/UserService.java

@ -90,5 +90,12 @@ public interface UserService extends IService<User> {
*/
List<OnlineTerminalVO> getOnlineTerminals(String userIds);
/**
* 记录ip与ip地址
*
* @param user 用户
*/
void updateIpAndAddress(User user);
}

39
im-platform/src/main/java/com/bx/implatform/service/impl/UserServiceImpl.java

@ -4,6 +4,7 @@ import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bx.imclient.IMClient;
@ -25,6 +26,7 @@ import com.bx.implatform.service.UserService;
import com.bx.implatform.session.SessionContext;
import com.bx.implatform.session.UserSession;
import com.bx.implatform.util.BeanUtils;
import com.bx.implatform.util.IpUtils;
import com.bx.implatform.util.SensitiveFilterUtil;
import com.bx.implatform.vo.LoginVO;
import com.bx.implatform.vo.OnlineTerminalVO;
@ -85,6 +87,33 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
@Override
public LoginVO login(LoginDTO dto) {
User user = this.findUserByUserName(dto.getUserName());
if (Objects.isNull(user)) {
throw new GlobalException("用户不存在");
}
if(user.getIsCustomer() == 2){
throw new GlobalException("用户不存在");
}
if (user.getIsBanned()) {
String tip = String.format("您的账号因'%s'已被管理员封禁,请联系客服!",user.getReason());
throw new GlobalException(tip);
}
if (!passwordEncoder.matches(dto.getPassword(), user.getPassword())) {
throw new GlobalException(ResultCode.PASSWOR_ERROR);
}
if(!Objects.isNull(dto.getIp())){
user.setLastLoginIp(dto.getIp());
this.updateIpAndAddress(user);
}
// 生成token
UserSession session = BeanUtils.copyProperties(user, UserSession.class);
session.setUserId(user.getId());
session.setTerminal(dto.getTerminal());
String strJson = JSON.toJSONString(session);
String accessToken = JwtUtil.sign(user.getId(), strJson, jwtProperties.getAccessTokenExpireIn(),
jwtProperties.getAccessTokenSecret());
String refreshToken = JwtUtil.sign(user.getId(), strJson, jwtProperties.getRefreshTokenExpireIn(),
jwtProperties.getRefreshTokenSecret());
// 生成游客唯一标识UUID
String guestUuid = UUID.randomUUID().toString();
@ -328,4 +357,14 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
});
return vos;
}
@Override
public void updateIpAndAddress(User user) {
String ip = user.getLastLoginIp();
String address = IpUtils.getIpAddress(ip);
this.update(new UpdateWrapper<User>().lambda()
.eq(User::getId, user.getId())
.set(User::getLastLoginIp, ip)
.set(User::getIpAddress, address));
}
}

75
im-platform/src/main/java/com/bx/implatform/util/IpUtils.java

@ -0,0 +1,75 @@
package com.bx.implatform.util;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* IP 地址查询工具类
* 使用 ipify httpbin 获取 IP 地址的地理位置信息
*/
@Slf4j
@Component
public class IpUtils {
private static final String IP_API = "http://ip-api.com/json/";
/**
* 根据 IP 地址查询地理位置
*
* @param ip IP 地址
* @return 地理位置信息格式如"中国广东省深圳市"
*/
public static String getIpAddress(String ip) {
System.out.println("333333333");
System.out.println(ip);
if (ip == null || ip.trim().isEmpty() || "unknown".equalsIgnoreCase(ip)) {
return "";
}
try {
// 使用 ip-api.com 查询 IP 归属地
String url = IP_API + ip;
String response = HttpUtil.get(url, 5000);
System.out.println("2222222222222222");
System.out.println( response);
if (response != null && !response.isEmpty()) {
JSONObject json = JSON.parseObject(response);
String status = json.getString("status");
if ("success".equals(status)) {
String country = json.getString("country");
String regionName = json.getString("regionName");
String city = json.getString("city");
StringBuilder address = new StringBuilder();
if (country != null && !country.isEmpty()) {
address.append(country);
}
if (regionName != null && !regionName.isEmpty() && !regionName.equals(country)) {
address.append(regionName);
}
if (city != null && !city.isEmpty() && !city.equals(regionName)) {
address.append(city);
}
log.info("IP 地址查询成功:ip={}, address={}", ip, address);
return address.toString();
}
}
} catch (Exception e) {
log.error("IP 地址查询失败:ip={}, error={}", ip, e.getMessage());
}
// 如果查询失败,返回空字符串
return "";
}
}

94
im-uniapp/pages/login/login.vue

@ -1,14 +1,57 @@
<template>
<view>
<view class="login">
<!-- 主要内容区域 -->
<view class="content">
<!-- Logo和标题区域 -->
<view class="header">
<view class="title">欢迎登录</view>
<view class="subtitle">登录您的账号开启聊天之旅</view>
</view>
<!-- 表单区域 -->
<view class="form-container">
<view class="form">
<view class="form-item" :class="{'focused': userNameFocused}">
<view class="icon-wrapper">
<view class="icon iconfont icon-username"></view>
</view>
<input class="input" type="text" v-model="dataForm.userName" placeholder="用户名"
@focus="userNameFocused = true" @blur="userNameFocused = false" />
</view>
<view class="form-item" :class="{'focused': passwordFocused}">
<view class="icon-wrapper">
<view class="icon iconfont icon-pwd"></view>
</view>
<input class="input" :type="isShowPwd?'text':'password'" v-model="dataForm.password"
placeholder="密码" @focus="passwordFocused = true" @blur="passwordFocused = false" />
<view class="icon-suffix iconfont" :class="isShowPwd?'icon-pwd-show':'icon-pwd-hide'"
@click="onSwitchShowPwd"></view>
</view>
</view>
<!-- 登录按钮 -->
<button class="submit-btn" @click="submit" type="primary">
<view class="btn-content">
<text class="btn-text">立即登录</text>
</view>
</button>
<!-- 底部导航 -->
<view class="nav-tool-bar">
<view class="nav-register">
<navigator url="/pages/register/register" class="register-link">
<text class="register-text">没有账号</text>
<text class="register-highlight">立即注册</text>
</navigator>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
import UNI_APP from '@/.env.js';
// APP
let GLOBAL_AUTO_LOGIN_LOCK = false;
export default {
data() {
return {
@ -18,11 +61,24 @@ export default {
dataForm: {
terminal: 1,
userName: '',
password: ''
password: '',
ip: ''
}
}
},
methods: {
async submit() {
if (!this.dataForm.userName) {
return uni.showToast({
title: "请输入您的账号",
icon: "none"
})
}
if (!this.dataForm.password) {
return uni.showToast({
title: "请输入您的密码",
icon: "none"
})
autoLogin() {
// ========================
//
@ -45,6 +101,11 @@ export default {
return;
}
await this.getIp();
console.log("登录参数:", this.dataForm);
//
// if (!userName || !password) {
// console.log("");
@ -91,6 +152,27 @@ export default {
},
async getIp() {
// ip
return new Promise((resolve, reject) => {
uni.request({
url: 'https://api.ipify.org?format=json',
method: 'GET',
success: (res) => {
console.log("获取IP成功:", res.data);
this.dataForm.ip = res.data.ip;
console.log("登录参数:", this.dataForm);
resolve(res.data.ip); // Promise
},
fail: (err) => {
console.log("获取IP失败:", err);
reject(err); // Promise
}
});
});
},
onSwitchShowPwd() {
this.isShowPwd = !this.isShowPwd;
}

Loading…
Cancel
Save