教师端部分接口实现

pull/1/head
陈沅 2 years ago
parent f261a8a684
commit cf6eea4975

@ -144,6 +144,11 @@
<artifactId>httpclient</artifactId>
<version>4.5.14</version>
</dependency>
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
<version>2.9.3</version>
</dependency>
</dependencies>
<build>

@ -25,7 +25,7 @@ public class JwtUser implements UserDetails {
private String className;
private int majorId;
private String majorName;
private String collegeId;
private int collegeId;
private String collegeName;
private List<String> authorityCodes;

@ -8,10 +8,14 @@ import org.springframework.security.authentication.UsernamePasswordAuthenticatio
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import javax.servlet.http.HttpServletRequest;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Base64;
import java.util.Date;
import java.util.List;
@ -23,6 +27,8 @@ public class TokenProvider {
private final static String SECRET_ZHIYUN = "zy_wh_mnjy_fp76ckwuczzmb67w0a8x0";
private final static String CURRENT_TO_ZHIYUN = "jVzvfoZU_eFN0CJcFARg0K6DlzTLa7oMWB7lV_y2s7bkv2Bem0281wEwlJp5afhsmM-Ynwvh3mAUTpwblGEz1A";
/**
* jwtToken
*
@ -66,7 +72,24 @@ public class TokenProvider {
.claim("classId", jwtUser.getClassId())
.claim("schoolId", jwtUser.getSchoolId())
.claim("username", jwtUser.getUsername())
.claim("authorityCodes",jwtUser.getAuthorityCodes())
.claim("authorityCodes", jwtUser.getAuthorityCodes())
.setIssuedAt(new Date(System.currentTimeMillis()))
.setExpiration(expiration)
.signWith(key, SignatureAlgorithm.HS512)
.compact();
}
public static String createZHIYUNToken(JwtUser jwtUser) {
Key key = Keys.hmacShaKeyFor(CURRENT_TO_ZHIYUN.getBytes());
Date expiration = new Date(System.currentTimeMillis() + EXP_TIME);
return Jwts.builder()
.claim("userId", jwtUser.getUserId())
.claim("roleId", jwtUser.getRoleId())
.claim("name", jwtUser.getName())
.claim("classId", jwtUser.getClassId())
.claim("schoolId", jwtUser.getSchoolId())
.claim("username", jwtUser.getUsername())
.claim("majorId", jwtUser.getMajorId())
.setIssuedAt(new Date(System.currentTimeMillis()))
.setExpiration(expiration)
.signWith(key, SignatureAlgorithm.HS512)
@ -97,7 +120,7 @@ public class TokenProvider {
jwtUser.setUsername(claims.get("name").toString());
return jwtUser;
} catch (Exception e) {
throw new UnAuthorizedException("token解析失败");
throw new UnAuthorizedException("token解析失败");
}
}
@ -107,7 +130,36 @@ public class TokenProvider {
// String prefix = "zy_wh_mnjy_";
// String generatedKey = generateKey(prefix);
// System.out.println("Generated Key: " + generatedKey);
getJWTUserByZhiYun(null);
// getJWTUserByZhiYun(null);
//生成一个新的长度为512字节的随机密钥供智云平台解析token
// int keyLength = 512; // 根据您的要求进行调整
// KeyGenerator keyGenerator;
// try {
// keyGenerator = KeyGenerator.getInstance("HmacSHA512");
// keyGenerator.init(keyLength);
// SecretKey secretKey = keyGenerator.generateKey();
// byte[] secretBytes = secretKey.getEncoded();
// String secret = Base64.getUrlEncoder().withoutPadding().encodeToString(secretBytes);
//
// System.out.println("Generated Secret: " + secret);
// } catch (NoSuchAlgorithmException e) {
// e.printStackTrace();
// }
JwtUser user = new JwtUser();
user.setUserId("486");
user.setRoleId(3);
user.setUsername("tzt006");
user.setSchoolId(1);
user.setSchoolName("天择大学");
user.setCollegeId(1);
user.setCollegeName("演示学院");
user.setMajorId(1);
user.setMajorName("产品演示专业");
String token = createZHIYUNToken(user);
System.out.println(token);
}
public static String generateKey(String prefix) {
@ -126,6 +178,7 @@ public class TokenProvider {
/**
*
*
* @param request request
* @return JwtUser
*/

@ -1,6 +1,7 @@
package com.sztzjy.forex.trading_trading.controller;
import cn.hutool.core.util.IdUtil;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageInfo;
import com.sztzjy.forex.trading_trading.annotation.Permission;
@ -8,22 +9,28 @@ import com.sztzjy.forex.trading_trading.annotation.aspect.PermissionType;
import com.sztzjy.forex.trading_trading.config.security.JwtUser;
import com.sztzjy.forex.trading_trading.config.security.TokenProvider;
import com.sztzjy.forex.trading_trading.dto.TrainingBO;
import com.sztzjy.forex.trading_trading.entity.Member;
import com.sztzjy.forex.trading_trading.entity.Training;
import com.sztzjy.forex.trading_trading.service.MemberService;
import com.sztzjy.forex.trading_trading.service.TrainingService;
import com.sztzjy.forex.trading_trading.util.ResultEntity;
import com.sztzjy.forex.trading_trading.util.TzApi;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.util.Assert;
import org.springframework.web.bind.annotation.*;
import org.w3c.dom.stylesheets.LinkStyle;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Api(tags = "实训管理")
@RestController
@ -32,6 +39,7 @@ import java.util.Map;
public class TrainingController {
private final TrainingService trainingService;
private final MemberService memberService;
private final HttpServletRequest request;
@ -40,16 +48,29 @@ public class TrainingController {
@PostMapping("create")
public ResultEntity create(@RequestBody TrainingBO bo) {
JwtUser currentUser = TokenProvider.getJWTUser(request);
trainingService.create(bo, currentUser);
Training training = trainingService.create(bo, currentUser);
List<Map<String, Object>> maps;
if (bo.getMajorId() == null || bo.getMajorId() == 0) {
maps = TzApi.GetClassBySchoolIdForForeignExchangeTrading(currentUser);
} else {
maps = TzApi.GetClassByMajorIdForForeignExchangeTrading(currentUser, bo.getMajorId());
}
String classIds = maps.stream()
.map(map -> String.valueOf(map.get("id")))
.collect(Collectors.joining(","));
List<Map<String, Object>> studentInfos = TzApi.GetStudentInfoByClassIdForForeignExchangeTrading(classIds, currentUser);
List<Member> members = buildMembers(studentInfos, training);
if (members != null && members.size() > 0) memberService.insertAll(members);
return new ResultEntity(HttpStatus.OK);
}
@Permission(codes = PermissionType.TRAINING_MANAGEMENT_DEL)
@ApiOperation("教师端----删除一条实训记录")
@PostMapping("deleteById")
public ResultEntity deleteById(@ApiParam("实训记录id") @RequestParam Integer trainingId) {
trainingService.delete(trainingId);
//TODO 同步删除member表数据
return new ResultEntity(HttpStatus.OK);
}
@ -91,4 +112,61 @@ public class TrainingController {
JwtUser currentUser = TokenProvider.getJWTUser(request);
return new ResultEntity<List<Map<String, Object>>>(HttpStatus.OK, trainingService.findTrainingNameList(currentUser));
}
@Permission(codes = PermissionType.TRAINING_MANAGEMENT_ADD)
@ApiOperation("教师端----添加实训成员时用:获取班级列表")
@GetMapping("findClassNameList")
public ResultEntity<List<Map<String, Object>>> findClassNameList(Integer majorId) {
JwtUser currentUser = TokenProvider.getJWTUser(request);
List<Map<String, Object>> mapList;
if (majorId == null || majorId == 0) {
mapList = TzApi.GetClassBySchoolIdForForeignExchangeTrading(currentUser);
} else {
mapList = TzApi.GetClassByMajorIdForForeignExchangeTrading(currentUser, majorId);
}
return new ResultEntity<List<Map<String, Object>>>(HttpStatus.OK, mapList);
}
@Permission(codes = PermissionType.TRAINING_MANAGEMENT_ADD)
@ApiOperation("教师端----根据所选的班级获取学生列表(分页展示)")
@GetMapping("findStudentListByClassIds")
public ResultEntity<PageInfo<Map<String, Object>>> findStudentListByClassIds(@ApiParam("页码") Integer index,
@ApiParam("页量") Integer size,
@ApiParam("班级id列表") @RequestParam List<Integer> classIds) {
JwtUser currentUser = TokenProvider.getJWTUser(request);
return new ResultEntity<PageInfo<Map<String, Object>>>(HttpStatus.OK, TzApi.PagedListStudentInfoByClassIdForForeignExchangeTrading(currentUser, String.join(",", classIds.toString()), index, size));
}
@Permission(codes = PermissionType.TRAINING_MANAGEMENT_ADD)
@ApiOperation("教师端----添加实训成员时用:根据学号或者学生名字获取用户信息")
@GetMapping("findStudentInfoByKeyword")
public ResultEntity<List<Map<String, Object>>> findStudentInfoByKeyword(@ApiParam("关键字") @RequestParam String keyword) {
JwtUser currentUser = TokenProvider.getJWTUser(request);
return new ResultEntity<List<Map<String, Object>>>(HttpStatus.OK, TzApi.GetStudentInfoByKeywordForForeignExchangeTrading(currentUser, keyword));
}
@Permission(codes = PermissionType.TRAINING_MANAGEMENT_ADD)
@ApiOperation("教师端----添加实训成员时用:获取专业列表下拉框")
@GetMapping("findMajorNameList")
public ResultEntity<List<Map<String, Object>>> findMajorNameList() {
JwtUser currentUser = TokenProvider.getJWTUser(request);
return new ResultEntity<List<Map<String, Object>>>(HttpStatus.OK, TzApi.GetMajorIdForForeignExchangeTrading(currentUser));
}
private List<Member> buildMembers(List<Map<String, Object>> list, Training training) {
List<Member> members = new ArrayList<>();
if (list != null && list.size() > 0) {
Member member = new Member();
member.setMemberId(IdUtil.simpleUUID());
member.setName(String.valueOf(list.get(0).get("name")));
member.setTrainingId(training.getTrainingId());
member.setSchoolId(training.getCreateSchoolId());
member.setClassGrade(String.valueOf(list.get(0).get("className")));
member.setMajor(String.valueOf(list.get(0).get("majorName")));
member.setStudentNumber(String.valueOf(list.get(0).get("studentNo")));
members.add(member);
}
return members;
}
}

@ -10,6 +10,7 @@ import lombok.Setter;
import org.springframework.data.annotation.Transient;
import java.util.Date;
import java.util.List;
@Data
@Getter
@ -24,17 +25,15 @@ public class TrainingBO {
@ApiModelProperty("实训结束时间")
private Date endTime;
@ApiModelProperty("创建人")
private String createBy;
@ApiModelProperty("创建学校")
private String createSchool;
@ApiModelProperty("实训名称")
private String trainingName;
@ApiModelProperty("参加实训人数")
@JsonIgnore
private Integer peopleCount;
@ApiModelProperty("实训专业")
private Integer majorId;
@ApiModelProperty("实训班级")
private List<Integer> classId;
}

@ -9,11 +9,11 @@ import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class MemberService {
public class MemberService {
@Autowired
MemberMapper memberMapper;
public Member getMemberByMemberIdAndTrainingId(String memberId,String trainingId){
public Member getMemberByMemberIdAndTrainingId(String memberId, String trainingId) {
MemberExample example = new MemberExample();
MemberExample.Criteria criteria = example.createCriteria();
criteria.andMemberIdEqualTo(memberId);
@ -22,12 +22,18 @@ public class MemberService {
return members.get(0);
}
public void updateByPrimaryKey(Member member){
public void updateByPrimaryKey(Member member) {
memberMapper.updateByPrimaryKey(member);
}
public Member selectByPrimaryKey(String memberId){
public Member selectByPrimaryKey(String memberId) {
Member member = memberMapper.selectByPrimaryKey(memberId);
return member;
}
public void insertAll(List<Member> members) {
for (Member member : members) {
memberMapper.insert(member);
}
}
}

@ -1,21 +1,26 @@
package com.sztzjy.forex.trading_trading.service;
import cn.hutool.core.util.IdUtil;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.sztzjy.forex.trading_trading.config.security.JwtUser;
import com.sztzjy.forex.trading_trading.dto.TrainingBO;
import com.sztzjy.forex.trading_trading.entity.Member;
import com.sztzjy.forex.trading_trading.entity.Training;
import com.sztzjy.forex.trading_trading.entity.TrainingExample;
import com.sztzjy.forex.trading_trading.mappers.TrainingMapper;
import com.sztzjy.forex.trading_trading.util.TzApi;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
public class TrainingService {
@ -24,13 +29,31 @@ public class TrainingService {
private TrainingMapper trainingMapper;
public void create(TrainingBO bo, JwtUser currentUser) {
public Training create(TrainingBO bo, JwtUser currentUser) {
//TODO 待完成通过学校id或者班级id到智云平台获取学生信息并将参与实训学生信息添加到member表中
if (checkTrainingName(bo.getTrainingName(), null)) {
throw new RuntimeException("实训名称已存在");
}
Training training = Training.buildTraining(bo, currentUser);
trainingMapper.insertSelective(training);
return training;
}
private List<Member> buildMembers(List<Map<String, Object>> list, Training training) {
List<Member> members = new ArrayList<>();
if (list != null && list.size() > 0) {
Member member = new Member();
member.setMemberId(IdUtil.simpleUUID());
member.setName(String.valueOf(list.get(0).get("name")));
member.setTrainingId(training.getTrainingId());
member.setSchoolId(training.getCreateSchoolId());
member.setClassGrade(String.valueOf(list.get(0).get("className")));
member.setMajor(String.valueOf(list.get(0).get("majorName")));
member.setStudentNumber(String.valueOf(list.get(0).get("studentNo")));
members.add(member);
}
return members;
}

@ -0,0 +1,50 @@
package com.sztzjy.forex.trading_trading.util;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
/**
*
*
*/
public class CacheProvider {
private Cache<String, Object> cache = null;
public CacheProvider(Integer expire, Integer maxSize) {
/**
* expireAfterAccess(long, TimeUnit) 访
*         expireAfterWrite(long, TimeUnit)
*/
if(cache==null){
cache = Caffeine.newBuilder()
.expireAfterWrite(expire, TimeUnit.SECONDS)
.maximumSize(maxSize)
.build();
}
}
public long getSize(){
return cache.estimatedSize();
}
public void put(String key,String value){
cache.put(key, value);
}
public void put(String key,Object value){
cache.put(key, value);
}
public Object get(String key){
return cache.getIfPresent(key);
}
public Object get(String key,Function<? super String, ? extends Object> fc){
return cache.get(key,fc);
}
public void remove(String key){
cache.invalidate(key);
}
}

@ -94,4 +94,37 @@ public class HttpUtils {
}
return null;
}
// 发送GET请求 携带Token
public static String sendGet(String url, String token) throws IOException {
HttpURLConnection connection = null;
BufferedReader reader = null;
StringBuilder response = new StringBuilder();
try {
URL requestUrl = new URL(url);
connection = (HttpURLConnection) requestUrl.openConnection();
connection.setRequestMethod("GET");
// 添加token到请求头部
connection.setRequestProperty("Authorization", "Bearer " + token);
reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
} finally {
if (reader != null) {
reader.close();
}
if (connection != null) {
connection.disconnect();
}
}
return response.toString();
}
}

@ -1,20 +1,43 @@
package com.sztzjy.forex.trading_trading.util;
import cn.hutool.json.JSONArray;
import com.fasterxml.jackson.core.type.TypeReference;
import cn.hutool.http.HttpStatus;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.pagehelper.PageInfo;
import com.nimbusds.jose.shaded.gson.JsonObject;
import com.sztzjy.forex.trading_trading.config.security.JwtUser;
import com.sztzjy.forex.trading_trading.config.security.TokenProvider;
import org.springframework.util.StringUtils;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.*;
public class TzApi {
private final static String API_URL = "http://Cloud.sztzjy.com";
private final static String LOGIN_URL = API_URL + "/Account/FireignExchangeTradingLogin";
private final static String LOGIN_URL = API_URL + "/Account/ForeignExchangeTradingLogin";
private final static String GET_CLASS = API_URL + "/Account/GetClassBySchoolIdForForeignExchangeTrading";
private final static String GET_MAJOR = API_URL + "/Account/GetMajorIdForForeignExchangeTrading";
private final static String GET_CLASS_BY_MAJOR = API_URL + "/Account/GetClassByMajorIdForForeignExchangeTrading";
private final static String GET_STUDENT_BY_ClALL = API_URL + "/Account/GetStudentInfoByClassIdForForeignExchangeTrading";
private final static String GET_STUDENT_BY_KEYWORD = API_URL + "/Account/GetStudentInfoByKeywordForForeignExchangeTrading";
private final static String PAGE_STUDENT_BY_KEYWORD = API_URL + "/Account/PagedListStudentInfoByClassIdForForeignExchangeTrading";
// 智云接口调用token加入缓存默认1小时过期
private static CacheProvider cacheProvider = new CacheProvider(2400, 6000);
public static JwtUser foreignExchangeTradingLogin(String userName, String password) {
@ -34,7 +57,7 @@ public class TzApi {
JSONObject jsonObject = object.getJSONObject("respString");
JSONObject resultObject = jsonObject.getJSONObject("result");
int code = resultObject.getInt("code");
if(code!= HttpStatus.HTTP_OK){
if (code != HttpStatus.HTTP_OK) {
throw new IllegalArgumentException("登录失败");
}
JSONObject dataObject = resultObject.getJSONObject("data");
@ -45,6 +68,12 @@ public class TzApi {
user.setRoleId(dataObject.getInt("roleId"));
user.setSchoolId(dataObject.getInt("schoolId"));
user.setClassId(dataObject.getInt("classId"));
user.setMajorId(dataObject.getInt("majorId"));
user.setClassName(dataObject.getStr("className"));
user.setMajorName(dataObject.getStr("majorName"));
user.setSchoolName(dataObject.getStr("schoolName"));
user.setCollegeId(dataObject.getInt("collegeId"));
user.setCollegeName(dataObject.getStr("collegeName"));
user.setUsername(userName);
user.setPassword(password);
return user;
@ -54,4 +83,138 @@ public class TzApi {
return null;
}
public static List<Map<String, Object>> GetClassBySchoolIdForForeignExchangeTrading(JwtUser user) {
String token = getToken(user);
String url = GET_CLASS;
return getDataFromApi(url, token);
}
public static List<Map<String, Object>> GetMajorIdForForeignExchangeTrading(JwtUser user) {
String token = getToken(user);
String url = GET_MAJOR;
return getDataFromApi(url, token);
}
public static List<Map<String, Object>> GetClassByMajorIdForForeignExchangeTrading(JwtUser user, int majorId) {
String token = getToken(user);
String url = GET_CLASS_BY_MAJOR + "?majorId=" + majorId;
return getDataFromApi(url, token);
}
public static List<Map<String, Object>> GetStudentInfoByClassIdForForeignExchangeTrading(String classIds, JwtUser user) {
String token = getToken(user);
String url = GET_STUDENT_BY_ClALL + "?classList=" + classIds;
return getDataFromApi(url, token);
}
public static List<Map<String, Object>> GetStudentInfoByKeywordForForeignExchangeTrading(JwtUser user, String keyword) {
String token = getToken(user);
String url = GET_STUDENT_BY_KEYWORD + "?keyword=" + keyword;
return getDataFromApi(url, token);
}
public static PageInfo<Map<String, Object>> PagedListStudentInfoByClassIdForForeignExchangeTrading(JwtUser user, String classIds, int page, int size) {
String token = getToken(user);
String url = PAGE_STUDENT_BY_KEYWORD + "?classList=" + classIds + "&page=" + page + "&size=" + size;
return getPageDataFromApi(url, token);
}
public static List<Map<String, Object>> getDataFromApi(String url, String token) {
List<Map<String, Object>> dataList = new ArrayList<>();
try {
String responseBody = HttpUtils.sendGet(url, token);
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(responseBody);
JsonNode resultNode = jsonNode.get("result");
JsonNode dataNode = resultNode.get("data");
if (dataNode.isArray()) {
for (JsonNode node : dataNode) {
Map<String, Object> dataMap = new HashMap<>();
dataMap.put("id", node.get("id").asText());
dataMap.put("name", node.get("name").asText());
dataList.add(dataMap);
}
}
} catch (Exception e) {
throw new IllegalArgumentException("获取数据异常");
}
return dataList;
}
public static PageInfo<Map<String, Object>> getPageDataFromApi(String url, String token) {
PageInfo pageInfo = new PageInfo();
try {
String responseBody = HttpUtils.sendGet(url, token);
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(responseBody);
JsonNode resultNode = jsonNode.get("result");
JsonNode dataNode = resultNode.get("data");
if (dataNode != null) {
pageInfo.setPages(resultNode.get("totalPages").asInt());
pageInfo.setHasPreviousPage(resultNode.get("hasPreviousPage").asBoolean());
pageInfo.setHasNextPage(resultNode.get("hasNextPage").asBoolean());
pageInfo.setTotal(resultNode.get("totalCount").asInt());
JsonNode retNode = dataNode.get("data");
List<Map<String,Object>> dataList = new ArrayList<>();
if(retNode.isArray()){
for(JsonNode node: retNode){
Map<String, Object> dataMap = new HashMap<>();
dataMap.put("id", node.get("id").asText());
dataMap.put("name", node.get("name").asText());
dataMap.put("studentNo", node.get("studentNo").asText());
dataMap.put("className", node.get("className").asText());
dataMap.put("majorName", node.get("majorName").asText());
dataList.add(dataMap);
}
}
pageInfo.setList(dataList);
}
} catch (Exception e) {
throw new IllegalArgumentException("获取数据异常");
}
return pageInfo;
}
private static String getToken(JwtUser user) {
try {
String access_token;
access_token = (String) cacheProvider.get(user.getUserId() + user.getUsername());
if (StringUtils.hasText(access_token)) {
System.out.println("-------->>> 从缓存中获取 access_token【成功】");
} else {
access_token = TokenProvider.createZHIYUNToken(user);
cacheProvider.put(user.getUserId() + user.getUsername(), access_token);
System.out.println("-------->>> 从远程获取 access_token【成功】");
}
return access_token;
} catch (Exception e) {
throw new IllegalArgumentException(e.getMessage());
}
}
public static void main(String[] args) {
JwtUser user = new JwtUser();
user.setUserId("486");
user.setRoleId(3);
user.setUsername("tzt006");
user.setSchoolId(1);
user.setSchoolName("天择大学");
user.setCollegeId(1);
user.setCollegeName("演示学院");
user.setMajorId(1);
user.setMajorName("产品演示专业");
PagedListStudentInfoByClassIdForForeignExchangeTrading(user, "7", 1, 10);
}
}

Loading…
Cancel
Save