提交 641abe31 编写于 作者: zhehao.chen's avatar zhehao.chen

Merge branch 'release' into 'master'

Release

review coder:陈哲浩

See merge request !40
流水线 #28955 已失败 于阶段
in 0 second
......@@ -11,7 +11,7 @@
<groupId>com.pica.cloud.account</groupId>
<artifactId>pica-cloud-account-client</artifactId>
<version>1.0.3.5</version>
<version>1.0.3.6</version>
<name>pica-cloud-account-client</name>
<packaging>jar</packaging>
......@@ -28,7 +28,7 @@
<dependency>
<groupId>com.pica.cloud.account</groupId>
<artifactId>pica-cloud-account-common</artifactId>
<version>1.0.1.4</version>
<version>1.0.1.6</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
......
......@@ -3,10 +3,14 @@ package com.pica.cloud.account.account.client;
import com.pica.cloud.account.account.common.req.EncryptEntity;
import com.pica.cloud.account.account.common.req.LoginResult;
import com.pica.cloud.account.account.common.req.OCINRequest;
import com.pica.cloud.account.account.common.req.circle.CircleAcctInitReq;
import com.pica.cloud.foundation.entity.PicaResponse;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import java.util.List;
/**
* Created on 2019/10/16 17:28
......@@ -22,4 +26,8 @@ public interface RegisterClient {
@PostMapping(value = "/account/register/ocin")
PicaResponse register(@RequestBody OCINRequest ocinRequest);
}
@PostMapping(value = "/account/circle/acct")
PicaResponse<List<Integer>> register(@RequestBody CircleAcctInitReq circleAcctInitReq, @RequestHeader(value = "token") String token);
}
\ No newline at end of file
......@@ -11,7 +11,7 @@
<groupId>com.pica.cloud.account</groupId>
<artifactId>pica-cloud-account-common</artifactId>
<version>1.0.1.4</version>
<version>1.0.1.6</version>
<name>pica-cloud-account-common</name>
<packaging>jar</packaging>
......
package com.pica.cloud.account.account.common.req.circle;
/**
* @DESCRIPTOIN:
* @AUTHOR: joy
* @DATE:2020/6/21 11:01 上午
*/
public class CircleAcctInit {
private String userName;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getEncryMobile() {
return encryMobile;
}
public void setEncryMobile(String encryMobile) {
this.encryMobile = encryMobile;
}
private String encryMobile;
}
package com.pica.cloud.account.account.common.req.circle;
import java.util.List;
/**
* @DESCRIPTOIN:
* @AUTHOR: joy
* @DATE:2020/6/21 11:02 上午
*/
public class CircleAcctInitReq {
private List<CircleAcctInit> circleAcctInitList;
private Integer registerSource; // 1 安卓 2 ios 3 web 4 h5 5 admin
private Integer circleId;
public List<CircleAcctInit> getCircleAcctInitList() {
return circleAcctInitList;
}
public void setCircleAcctInitList(List<CircleAcctInit> circleAcctInitList) {
this.circleAcctInitList = circleAcctInitList;
}
public Integer getRegisterSource() {
return registerSource;
}
public void setRegisterSource(Integer registerSource) {
this.registerSource = registerSource;
}
public Integer getCircleId() {
return circleId;
}
public void setCircleId(Integer circleId) {
this.circleId = circleId;
}
}
......@@ -138,7 +138,7 @@
<dependency>
<groupId>com.pica.cloud.account</groupId>
<artifactId>pica-cloud-account-common</artifactId>
<version>1.0.1.4</version>
<version>1.0.1.6</version>
</dependency>
<dependency>
......
package com.pica.cloud.account.account.server.controller;
import com.pica.cloud.account.account.common.req.circle.CircleAcctInitReq;
import com.pica.cloud.account.account.server.service.CircleAccountService;
import com.pica.cloud.foundation.entity.PicaResponse;
import com.pica.cloud.foundation.service.starter.interceptor.EnabledLoginValidate;
import io.swagger.annotations.Api;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @DESCRIPTOIN:
* @AUTHOR: joy
* @DATE:2020/6/21 10:22 上午
*/
@Api(description = "")
@RestController
@RequestMapping("/circle")
public class CircleUserController {
private Logger logger = LoggerFactory.getLogger(CircleUserController.class);
@Autowired
private CircleAccountService circleAccountService;
@PostMapping("/acct")
@EnabledLoginValidate
public PicaResponse<List<Integer>> circleUserInit(@RequestBody CircleAcctInitReq circleAcctInitReq) {
return PicaResponse.toResponse(circleAccountService.createCircleAccount(circleAcctInitReq));
}
}
......@@ -198,6 +198,7 @@ public class LoginController extends AccountBaseController {
try {
cacheClient.expire(cache_prifix + request.getWeChatCode(), 60);
long doctorId = super.getDoctorIdByToken();
logger.info("bindWeChat doctorId:{}",doctorId);
String nickname = loginService.bindWeChat(doctorId, request);
Map<String, String> map = new HashMap();
map.put("nickname", nickname);
......
......@@ -16,6 +16,7 @@ import com.pica.cloud.account.account.server.util.AESUtil;
import com.pica.cloud.account.account.server.util.AccountUtils;
import com.pica.cloud.account.account.server.util.CryptoUtil;
import com.pica.cloud.foundation.entity.PicaResponse;
import com.pica.cloud.foundation.service.starter.interceptor.EnabledLoginValidate;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -42,6 +43,7 @@ public class ModifyMobileController extends AccountBaseController {
@ApiOperation("修改手机号")
@PostMapping("/mobile/modify")
@EnabledLoginValidate
public PicaResponse modifyMobile(@RequestBody EncryptEntity entity) throws Exception {
Long doctorId = super.getDoctorIdByToken();
Doctor doctorInfo = doctorService.getDoctorInfo(doctorId.intValue());
......
......@@ -23,6 +23,7 @@ public enum AccountTypeEnum {
//产品来源相关枚举
PRODUCT_TYPE_DOCTOR(1, "云鹊医产品系"),
PRODUCT_TYPE_HEALTH(2, "云鹊健康产品系"),
PRODUCT_TYPE_ECO_LIVE(3, "生态直播"),
//终端类型
DEVICE_TYPE_ANDROID(1, "安卓"),
......
......@@ -41,4 +41,6 @@ public interface AccountUnionMapper {
* @param unionId
*/
void updateUnionStatus(String unionId);
int deleteByAcctId(Integer acctId);
}
\ No newline at end of file
......@@ -22,7 +22,7 @@ public interface AccountService {
Account getByUnionid(String unionid);
//创建账号
void createAccount(Account account);
void createAccount(Account account,Integer bizType);
//更新账号信息
void updateAccountById(Account account);
......
package com.pica.cloud.account.account.server.service;
import com.pica.cloud.account.account.common.req.circle.CircleAcctInitReq;
import com.pica.cloud.account.account.server.entity.Account;
import com.pica.cloud.account.account.server.entity.AccountInfoEntity;
import java.util.List;
import java.util.Map;
/**
*
*/
public interface CircleAccountService {
//创建圈子入口-用户账号
List<Integer> createCircleAccount(CircleAcctInitReq circleAcctInitReq);
}
......@@ -77,7 +77,7 @@ public class AccountServiceImpl implements AccountService {
//创建账号
@Override
@Transactional
public void createAccount(Account account) {
public void createAccount(Account account, Integer bizType) {
//账户表
AccountInfoEntity accountInfo = new AccountInfoEntity();
Date currentTime = new Date();
......@@ -90,8 +90,16 @@ public class AccountServiceImpl implements AccountService {
accountInfo.setRegTime(currentTime);
accountInfo.setDeleteFlag(1);
accountInfo.setSex(0);
accountInfo.setRegisterProduct(AccountTypeEnum.PRODUCT_TYPE_DOCTOR.getCode());
accountInfo.setRegisterSource(AccountTypeEnum.DEVICE_TYPE_H5.getCode());
if(null != bizType && bizType.equals(AccountTypeEnum.PRODUCT_TYPE_ECO_LIVE.getCode())) {
accountInfo.setRegisterProduct(AccountTypeEnum.PRODUCT_TYPE_ECO_LIVE.getCode());
}else {
accountInfo.setRegisterProduct(AccountTypeEnum.PRODUCT_TYPE_DOCTOR.getCode());
}
if(null != account.getRegisterSource() && 0 != account.getRegisterSource()){
accountInfo.setRegisterSource(account.getRegisterSource());
}else {
accountInfo.setRegisterSource(AccountTypeEnum.DEVICE_TYPE_H5.getCode());
}
accountInfoDetailMapper.insertSelective(accountInfo);
Integer acctId = accountInfo.getId();
//doctor表,存入用户id
......@@ -102,7 +110,11 @@ public class AccountServiceImpl implements AccountService {
account.setModifyId(0L);
account.setAcctId(acctId);
account.setCreatTime(currentTime);
account.setRegisterSource(AccountTypeEnum.DEVICE_TYPE_H5.getCode());
if(null != account.getRegisterSource() && 0 != account.getRegisterSource()){
account.setRegisterSource(account.getRegisterSource());
}else {
account.setRegisterSource(AccountTypeEnum.DEVICE_TYPE_H5.getCode());
}
account.setModifyTime(currentTime);
account.setFirstLoginTime(currentTime);
account.setLastLoginTime(currentTime);
......
package com.pica.cloud.account.account.server.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.pica.cloud.account.account.common.req.circle.CircleAcctInit;
import com.pica.cloud.account.account.common.req.circle.CircleAcctInitReq;
import com.pica.cloud.account.account.server.entity.Account;
import com.pica.cloud.account.account.server.enums.AccountTypeEnum;
import com.pica.cloud.account.account.server.mapper.AccountMapper;
import com.pica.cloud.account.account.server.service.AccountService;
import com.pica.cloud.account.account.server.service.CircleAccountService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
/**
* @DESCRIPTOIN:
* @AUTHOR: joy
* @DATE:2020/6/21 10:25 上午
*/
@Service
public class CircleAccountServiceImpl implements CircleAccountService {
private static Logger logger = LoggerFactory.getLogger(CircleAccountServiceImpl.class);
@Autowired
private AccountService accountService;
@Autowired
private AccountMapper accountMapper;
@Override
@Transactional
public List<Integer> createCircleAccount(CircleAcctInitReq circleAcctInitReq) {
logger.info("createCircleAccount:{}", JSONObject.toJSONString(circleAcctInitReq));
List<CircleAcctInit> circleAcctInits = circleAcctInitReq.getCircleAcctInitList();
List<Integer> savedIds = new ArrayList<>();
try {
for(CircleAcctInit acct : circleAcctInits){
Account dbAcct = accountMapper.getByMobilePhone(acct.getEncryMobile()); //获取医生表账号信息
if(null == dbAcct){
Account account = new Account();
account.setName(acct.getUserName());
account.setNickname(acct.getUserName());
account.setMobilePhone(acct.getEncryMobile());
account.setRegisterSource(circleAcctInitReq.getRegisterSource());
accountService.createAccount(account,AccountTypeEnum.PRODUCT_TYPE_ECO_LIVE.getCode());
savedIds.add(account.getId().intValue());
logger.info("createCircleAccount insert {}",account.getId().intValue());
}else {
savedIds.add(dbAcct.getId().intValue());
logger.info("createCircleAccount exist {}",dbAcct.getId().intValue());
}
}
}catch (Exception e){
logger.error("createCircleAccount error:{}",e.getMessage());
throw e;
}
return savedIds;
}
}
......@@ -6,10 +6,7 @@ import com.pica.cloud.account.account.server.entity.Doctor;
import com.pica.cloud.account.account.server.enums.AccountExceptionEnum;
import com.pica.cloud.account.account.server.enums.AccountTypeEnum;
import com.pica.cloud.account.account.server.exception.AccountException;
import com.pica.cloud.account.account.server.mapper.AccountInfoDetailMapper;
import com.pica.cloud.account.account.server.mapper.DoctorEducationMapper;
import com.pica.cloud.account.account.server.mapper.DoctorHospitalMapper;
import com.pica.cloud.account.account.server.mapper.DoctorMapper;
import com.pica.cloud.account.account.server.mapper.*;
import com.pica.cloud.account.account.server.service.DoctorService;
import com.pica.cloud.account.account.server.util.AESUtil;
import com.pica.cloud.account.account.server.util.AccountUtils;
......@@ -49,6 +46,9 @@ public class DoctorServiceImpl implements DoctorService {
@Autowired
private DoctorHospitalMapper doctorHospitalMapper;
@Autowired
private AccountUnionMapper accountUnionMapper;
@Override
public Doctor getDoctorInfo(Integer id) {
return doctorMapper.selectByPrimaryKey(id);
......@@ -98,6 +98,8 @@ public class DoctorServiceImpl implements DoctorService {
acctMap.put("modifyId",modifyId);
acctMap.put("acctId",acctId.longValue());
accountInfoDetailMapper.updateDeleteByPrimaryKey(acctMap);
logger.info("deleteDoctorInfo acctId:{}",acctId);
accountUnionMapper.deleteByAcctId(acctId);
} else {
throw new AccountException(AccountExceptionEnum.PICA_NOT_REGISTER);
}
......
......@@ -270,7 +270,7 @@ public class LoginServiceImpl implements LoginService {
intactUtil.sendIntact(batchNo,"pwdLoginCorrect",com.pica.cloud.foundation.completeness.contract.constants.CommonConstants.INTACT_CONTENT_LOG_STATUS_3,"request:"+ JSON.toJSONString(request)+",+mobile 此手机号无用户:"+mobile+",encrypt:"+",accountInfoEntity:"+JSON.toJSONString(accountInfoEntity));
}
Integer userId = 0;
if (productType == AccountTypeEnum.PRODUCT_TYPE_DOCTOR.getCode()) {
if (productType != AccountTypeEnum.PRODUCT_TYPE_HEALTH.getCode()) {
userId = doctorInfo.getId();
} else if (productType == AccountTypeEnum.PRODUCT_TYPE_HEALTH.getCode()) {
AccountPatientInfoEntity accountPatientInfoEntity = accountPatientInfoMapper.selectByAcctId(acctId);
......@@ -288,7 +288,7 @@ public class LoginServiceImpl implements LoginService {
result.setUserId(userId.longValue());
result.setMobile(mobile);
result.setDoctorId(EncryptUtils.encryptContent(userId + "", EncryptConstants.ENCRYPT_TYPE_ID));
if (productType == AccountTypeEnum.PRODUCT_TYPE_DOCTOR.getCode()) {
if (productType != AccountTypeEnum.PRODUCT_TYPE_HEALTH.getCode()) { //非居民时,都为医生产品渠道
result.setEntireFlag(doctorInfo.getEntireFlag());
LogLoginEntity entity = AccountLogEntityUtils.getLogLoginEntity(acctId, productType, sourceType,
......@@ -353,7 +353,7 @@ public class LoginServiceImpl implements LoginService {
result.setMobile(baseRequest.getMobile());
result.setDoctorId(EncryptUtils.encryptContent(userId + "", EncryptConstants.ENCRYPT_TYPE_ID));
//是否完善过个人信息(云鹊医app才需要)
if (baseRequest.getProductType() == AccountTypeEnum.PRODUCT_TYPE_DOCTOR.getCode()) {
if (baseRequest.getProductType() != AccountTypeEnum.PRODUCT_TYPE_HEALTH.getCode()) {
Doctor doctorEntity = doctorInfoMapper.selectByPrimaryKey(userId.intValue());
result.setEntireFlag(doctorEntity.getEntireFlag());
}
......@@ -398,6 +398,7 @@ public class LoginServiceImpl implements LoginService {
logger.info("loginByWeChat: 获取微信用户信息:{}",JSONObject.toJSONString(weChatUserInfoEntity));
String unionId = weChatUserInfoEntity.getUnionid();
AccountUnionEntity accountUnionEntity = accountUnionMapper.selectByUnionId(unionId);
logger.info("loginByWeChat accountUnionEntity:{}",JSONObject.toJSONString(accountUnionEntity));
//是否绑定逻辑的判断
if (accountUnionEntity != null) {
Long acctId = accountUnionEntity.getAcctId();
......@@ -415,7 +416,7 @@ public class LoginServiceImpl implements LoginService {
result.setUserId(userId);
result.setBindFlag(AccountTypeEnum.BIND_STATUS_SUCCESS.getCode() + "");
result.setDoctorId(EncryptUtils.encryptContent(userId + "", EncryptConstants.ENCRYPT_TYPE_ID));
if (request.getProductType() == AccountTypeEnum.PRODUCT_TYPE_DOCTOR.getCode()) {
if (request.getProductType() != AccountTypeEnum.PRODUCT_TYPE_HEALTH.getCode()) {
PICAPDoctor doctor = doctorInfoMapper.queryDoctor(userId);
result.setEntireFlag(doctor.getEntire_flag());
result.setMobile(AESUtil.decryptV0(doctor.getMobile_phone()));
......@@ -527,6 +528,10 @@ public class LoginServiceImpl implements LoginService {
private void processAccountUnion(Integer acctId, String unionId, Integer productType) {
//接入新旭事务一致性
String batchNo = IntactUtils.getUUID();
if(null == acctId || 0 == acctId){
throw new PicaException(AccountExceptionEnum.PICA_LOGIN_AGAIN.getCode(), AccountExceptionEnum.PICA_LOGIN_AGAIN.getMessage());
}
intactUtil.sendIntact(batchNo,"processAccountUnion",com.pica.cloud.foundation.completeness.contract.constants.CommonConstants.INTACT_CONTENT_LOG_STATUS_1,"acctId:"+acctId+",unionId:"+unionId+",productType:"+productType);
//先查询当前产品线是否有记录?如果有就更新成delete_flag=2; 然后在插入新的绑定记录
AccountUnionEntity accountUnionResult = accountUnionMapper.selectByUnionId(unionId);
......@@ -582,7 +587,7 @@ public class LoginServiceImpl implements LoginService {
accountWeChatInfoEntity.setNickname(weChatUserInfoEntity.getNickname());
accountWeChatInfoEntity.setHeadImgUrl(weChatUserInfoEntity.getHeadimgurl());
accountWeChatInfoEntity.setCountry(weChatUserInfoEntity.getCountry());
accountWeChatInfoEntity.setSex(weChatUserInfoEntity.getSex());
accountWeChatInfoEntity.setSex(null == weChatUserInfoEntity.getSex() ? 0 : weChatUserInfoEntity.getSex());
accountWeChatInfoEntity.setProvince(weChatUserInfoEntity.getProvince());
accountWeChatInfoEntity.setLanguage(weChatUserInfoEntity.getLanguage());
accountWeChatInfoMapper.insertSelective(accountWeChatInfoEntity);
......@@ -750,7 +755,7 @@ public class LoginServiceImpl implements LoginService {
result.setUserId(userId);
result.setBindFlag(AccountTypeEnum.BIND_STATUS_SUCCESS.getCode() + "");
result.setDoctorId(EncryptUtils.encryptContent(userId + "", EncryptConstants.ENCRYPT_TYPE_ID));
if (request.getProductType() == AccountTypeEnum.PRODUCT_TYPE_DOCTOR.getCode()) {
if (request.getProductType() != AccountTypeEnum.PRODUCT_TYPE_HEALTH.getCode()) {
PICAPDoctor doctor = doctorInfoMapper.queryDoctor(userId);
result.setEntireFlag(doctor.getEntire_flag());
result.setMobile(AESUtil.decryptV0(doctor.getMobile_phone()));
......
......@@ -133,7 +133,7 @@ public class PasswordServiceImpl implements PasswordService {
result.setMobile(request.getMobile());
result.setDoctorId(EncryptUtils.encryptContent(userId + "", EncryptConstants.ENCRYPT_TYPE_ID));
// 是否完善过个人信息(云鹊医app才需要)
if (request.getProductType() == AccountTypeEnum.PRODUCT_TYPE_DOCTOR.getCode()) {
if (request.getProductType() != AccountTypeEnum.PRODUCT_TYPE_HEALTH.getCode()) {
Doctor doctorEntity = doctorInfoMapper.selectByPrimaryKey(userId.intValue());
result.setEntireFlag(doctorEntity.getEntireFlag());
}
......
......@@ -189,7 +189,7 @@ public class AESUtil {
String KEY="zJJ$c5md3$yuuhWW";
String KEY="111";
System.out.println("-------------加密---------");
String content = "18709744120";
......@@ -211,7 +211,6 @@ public class AESUtil {
// String str="13330782565,13638247234,15208346780,13665702440,13171898394,13526001352,15637729989,18282702080,17839157550,13733479385,13873347938,18192022131,17868481983,13389208740,15130643581,18743289267,15025550691,18706903023,15153299810,13400213017,13400213014,13809393727,15082898689,15181524146,13067777147,15936327251,13982581989,13055116890,13183128853,13526235120,13620258773,13470126432,15379993781,15612968111,15930496256,13504498834,13328506266,13405379887,18636815186,18638124991,18997577751,18742986968,13737844850,15249387846,13890801202,18294832224,15329652816,13453947981,17393142302,18219810087,15031950900,18670808468,18670508468,18670508568,15566394123,18719884109,13789221826,13939497532,13939925847,13791830377,18919411543,18893835167,18194329526,13207866808,13082126549,15802548543,15879451129,15390381641,13132431383,18279911958,13827920609,15209825253,15509825253,18184482231,13325225232,15908034636,15352111767,18709744120,15807269519,19971489100,13721734937,13765575183,15329652819,13883396206,18085581329,15090694439,15090694436,13782477033,13207995156,13630682016,15607241351,13830780802";
// String[] arr = str.split(",");
// for (int i = 0; i < arr.length; i++) {
// String KEY="zJJ$c5md3$yuuhWW";
// System.out.println("-------------加密---------");
// String content = arr[i];
// System.out.println("加密前:" + content);
......
......@@ -169,7 +169,7 @@ public class TokenUtils {
// cacheClient.hset(value, "token", newToken);
// }
} catch (Exception ex) {
logger.error("生成token异常:{}" + ex.getMessage(), ex);
logger.error("生成token异常:{}",ex.getMessage());
}
return newToken;
}
......
......@@ -54,8 +54,8 @@ public class WeChatUtils {
}
} else {
// 获取token失败
logger.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
// logger.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
logger.error("网页授权获取jsonObjet失败,对象为null");
}
sendIntact(batchNo,"getAuthorizationInfo",com.pica.cloud.foundation.completeness.contract.constants.CommonConstants.INTACT_CONTENT_LOG_STATUS_3,"appId:"+appId+",appSecret"+appSecret+",code:"+code);
......
......@@ -35,7 +35,7 @@ ribbon.ConnectTimeout=60000
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
memcached.url=172.19.121.31:11211
memcached.url=172.19.137.65:11211
#微信登陆
weChatAppID=wx5103ed453ef2dbe8
......
......@@ -24,6 +24,12 @@
where id = #{id,jdbcType=INTEGER}
</select>
<update id="deleteByAcctId" parameterType="java.lang.Integer">
update account_union
set delete_flag = 2,modified_time=NOW()
where acct_id = #{acctId} and delete_flag = 1
</update>
<!--通过unionId查询用户信息-->
<select id="selectByUnionId" resultMap="BaseResultMap" parameterType="java.lang.String">
select
......
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册