完善用户信息功能

master
382696293@qq.com 2 years ago
parent 22ddcb532a
commit ee69fdc4d6

@ -0,0 +1,7 @@
package com.flossom.common.core.constant;
public class SysRegionConstants {
public static final int PROVINCE_PID = 0;
}

@ -0,0 +1,81 @@
package com.flossom.hzMapper.domain;
import com.flossom.common.core.annotation.Excel;
import com.flossom.common.core.web.domain.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
/**
* sys_region
*
* @author flossom
* @date 2023-12-12
*/
public class SysRegion extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* id
*/
private Long id;
/**
*
*/
@Excel(name = "地区名称")
private String name;
/**
* id
*/
@Excel(name = "父id")
private Long parentId;
/**
*
*/
@Excel(name = "地区等级")
private Integer level;
public void setId(Long id) {
this.id = id;
}
public Long getId() {
return id;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setParentId(Long parentId) {
this.parentId = parentId;
}
public Long getParentId() {
return parentId;
}
public void setLevel(Integer level) {
this.level = level;
}
public Integer getLevel() {
return level;
}
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("name", getName())
.append("parentId", getParentId())
.append("level", getLevel())
.toString();
}
}

@ -89,18 +89,36 @@ public class WxUserMember extends BaseEntity {
@Excel(name = "个人二维码")
private String userQr;
/**
* id
*/
@Excel(name = "省id")
private String provinceId;
/**
*
*/
@Excel(name = "省")
private String province;
/**
* id
*/
@Excel(name = "市id")
private String cityId;
/**
*
*/
@Excel(name = "市")
private String city;
/**
* id
*/
@Excel(name = "区id")
private String areaId;
/**
*
*/
@ -369,39 +387,95 @@ public class WxUserMember extends BaseEntity {
return status;
}
public String getProvinceId() {
return provinceId;
}
public void setProvinceId(String provinceId) {
this.provinceId = provinceId;
}
public String getCityId() {
return cityId;
}
public void setCityId(String cityId) {
this.cityId = cityId;
}
public String getAreaId() {
return areaId;
}
public void setAreaId(String areaId) {
this.areaId = areaId;
}
public WxUserMember() {
}
public WxUserMember(Long id, String nickname, String headimg, String username, BigDecimal credit, String openid, String unionid, Integer userType, Integer level, String mobile, String password, String userQr, String provinceId, String province, String cityId, String city, String areaId, String area, Date birthday, Integer clock, Integer activity, String wechat, String code, Integer isAbutment, BigDecimal collagenDay, BigDecimal collagenMount, Date loginTime, Integer status) {
this.id = id;
this.nickname = nickname;
this.headimg = headimg;
this.username = username;
this.credit = credit;
this.openid = openid;
this.unionid = unionid;
this.userType = userType;
this.level = level;
this.mobile = mobile;
this.password = password;
this.userQr = userQr;
this.provinceId = provinceId;
this.province = province;
this.cityId = cityId;
this.city = city;
this.areaId = areaId;
this.area = area;
this.birthday = birthday;
this.clock = clock;
this.activity = activity;
this.wechat = wechat;
this.code = code;
this.isAbutment = isAbutment;
this.collagenDay = collagenDay;
this.collagenMount = collagenMount;
this.loginTime = loginTime;
this.status = status;
}
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("nickname", getNickname())
.append("headimg", getHeadimg())
.append("username", getUsername())
.append("credit", getCredit())
.append("openid", getOpenid())
.append("unionid", getUnionid())
.append("userType", getUserType())
.append("level", getLevel())
.append("mobile", getMobile())
.append("password", getPassword())
.append("userQr", getUserQr())
.append("province", getProvince())
.append("city", getCity())
.append("area", getArea())
.append("birthday", getBirthday())
.append("clock", getClock())
.append("activity", getActivity())
.append("wechat", getWechat())
.append("code", getCode())
.append("isAbutment", getIsAbutment())
.append("collagenDay", getCollagenDay())
.append("collagenMount", getCollagenMount())
.append("loginTime", getLoginTime())
.append("status", getStatus())
.append("createBy", getCreateBy())
.append("createTime", getCreateTime())
.append("updateBy", getUpdateBy())
.append("updateTime", getUpdateTime())
.append("remark", getRemark())
.toString();
return "WxUserMember{" +
"id=" + id +
", nickname='" + nickname + '\'' +
", headimg='" + headimg + '\'' +
", username='" + username + '\'' +
", credit=" + credit +
", openid='" + openid + '\'' +
", unionid='" + unionid + '\'' +
", userType=" + userType +
", level=" + level +
", mobile='" + mobile + '\'' +
", password='" + password + '\'' +
", userQr='" + userQr + '\'' +
", provinceId='" + provinceId + '\'' +
", province='" + province + '\'' +
", cityId='" + cityId + '\'' +
", city='" + city + '\'' +
", areaId='" + areaId + '\'' +
", area='" + area + '\'' +
", birthday=" + birthday +
", clock=" + clock +
", activity=" + activity +
", wechat='" + wechat + '\'' +
", code='" + code + '\'' +
", isAbutment=" + isAbutment +
", collagenDay=" + collagenDay +
", collagenMount=" + collagenMount +
", loginTime=" + loginTime +
", status=" + status +
'}';
}
}

@ -0,0 +1,65 @@
package com.flossom.hzMapper.mapper;
import com.flossom.hzMapper.domain.SysRegion;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* Mapper
*
* @author flossom
* @date 2023-12-12
*/
public interface SysRegionMapper {
/**
*
*
* @param id
* @return
*/
public SysRegion selectSysRegionById(Long id);
/**
*
*
* @param sysRegion
* @return
*/
public List<SysRegion> selectSysRegionList(SysRegion sysRegion);
/**
*
*
* @param sysRegion
* @return
*/
public int insertSysRegion(SysRegion sysRegion);
/**
*
*
* @param sysRegion
* @return
*/
public int updateSysRegion(SysRegion sysRegion);
/**
*
*
* @param id
* @return
*/
public int deleteSysRegionById(Long id);
/**
*
*
* @param ids
* @return
*/
public int deleteSysRegionByIds(Long[] ids);
List<SysRegion> selectSysAreaByPid(@Param("pid") Integer pid);
}

@ -0,0 +1,74 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.flossom.hzMapper.mapper.SysRegionMapper">
<resultMap type="SysRegion" id="SysRegionResult">
<result property="id" column="id" />
<result property="name" column="name" />
<result property="parentId" column="parent_id" />
<result property="level" column="level" />
</resultMap>
<sql id="selectSysRegionVo">
select id, name, parent_id, level from sys_region
</sql>
<select id="selectSysRegionList" parameterType="SysRegion" resultMap="SysRegionResult">
<include refid="selectSysRegionVo"/>
<where>
<if test="name != null and name != ''"> and name like concat('%', #{name}, '%')</if>
<if test="parentId != null "> and parent_id = #{parentId}</if>
<if test="level != null "> and level = #{level}</if>
</where>
</select>
<select id="selectSysRegionById" parameterType="Long" resultMap="SysRegionResult">
<include refid="selectSysRegionVo"/>
where id = #{id}
</select>
<select id="selectSysAreaByPid" resultType="com.flossom.hzMapper.domain.SysRegion">
<include refid="selectSysRegionVo"/>
WHERE
parent_id = #{pid}
ORDER BY
id ASC
</select>
<insert id="insertSysRegion" parameterType="SysRegion" useGeneratedKeys="true" keyProperty="id">
insert into sys_region
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="name != null and name != ''">name,</if>
<if test="parentId != null">parent_id,</if>
<if test="level != null">level,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="name != null and name != ''">#{name},</if>
<if test="parentId != null">#{parentId},</if>
<if test="level != null">#{level},</if>
</trim>
</insert>
<update id="updateSysRegion" parameterType="SysRegion">
update sys_region
<trim prefix="SET" suffixOverrides=",">
<if test="name != null and name != ''">name = #{name},</if>
<if test="parentId != null">parent_id = #{parentId},</if>
<if test="level != null">level = #{level},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteSysRegionById" parameterType="Long">
delete from sys_region where id = #{id}
</delete>
<delete id="deleteSysRegionByIds" parameterType="String">
delete from sys_region where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

@ -17,6 +17,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="mobile" column="mobile" />
<result property="password" column="password" />
<result property="userQr" column="user_qr" />
<result property="provinceId" column="province_id" />
<result property="cityId" column="city_id" />
<result property="areaId" column="area_id" />
<result property="province" column="province" />
<result property="city" column="city" />
<result property="area" column="area" />
@ -38,7 +41,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</resultMap>
<sql id="selectWxUserMemberVo">
select id, nickname, headimg, username, credit, openid, unionid, user_type, level, mobile, password, user_qr, province, city, area, birthday, clock, activity, wechat, code, is_abutment, collagen_day, collagen_mount, login_time, status, create_by, create_time, update_by, update_time, remark from wx_user_member
select id, nickname, headimg, username, credit, openid, unionid, user_type, level, mobile, password, user_qr, province_id, city_id, area_id, province, city, area, birthday, clock, activity, wechat, code, is_abutment, collagen_day, collagen_mount, login_time, status, create_by, create_time, update_by, update_time, remark from wx_user_member
</sql>
<select id="selectWxUserMemberList" parameterType="WxUserMember" resultMap="WxUserMemberResult">
@ -55,6 +58,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="mobile != null and mobile != ''"> and mobile = #{mobile}</if>
<if test="password != null and password != ''"> and password = #{password}</if>
<if test="userQr != null and userQr != ''"> and user_qr = #{userQr}</if>
<if test="provinceId != null and provinceId != ''"> and province = #{provinceId}</if>
<if test="cityId != null and cityId != ''"> and city = #{cityId}</if>
<if test="areaId != null and areaId != ''"> and area = #{areaId}</if>
<if test="province != null and province != ''"> and province = #{province}</if>
<if test="city != null and city != ''"> and city = #{city}</if>
<if test="area != null and area != ''"> and area = #{area}</if>
@ -94,6 +100,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="mobile != null">mobile,</if>
<if test="password != null">password,</if>
<if test="userQr != null">user_qr,</if>
<if test="provinceId != null">province_id,</if>
<if test="cityId != null">city_id,</if>
<if test="areaId != null">area_id,</if>
<if test="province != null">province,</if>
<if test="city != null">city,</if>
<if test="area != null">area,</if>
@ -125,6 +134,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="mobile != null">#{mobile},</if>
<if test="password != null">#{password},</if>
<if test="userQr != null">#{userQr},</if>
<if test="provinceId != null">#{provinceId},</if>
<if test="cityId != null">#{cityId},</if>
<if test="areaId != null">#{areaId},</if>
<if test="province != null">#{province},</if>
<if test="city != null">#{city},</if>
<if test="area != null">#{area},</if>
@ -160,6 +172,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="mobile != null">mobile = #{mobile},</if>
<if test="password != null">password = #{password},</if>
<if test="userQr != null">user_qr = #{userQr},</if>
<if test="provinceId != null">province_id = #{provinceId},</if>
<if test="cityId != null">city_id = #{cityId},</if>
<if test="areaId != null">area_id = #{areaId},</if>
<if test="province != null">province = #{province},</if>
<if test="city != null">city = #{city},</if>
<if test="area != null">area = #{area},</if>

@ -0,0 +1,35 @@
package com.flossom.miniProgram.controller;
import com.flossom.common.core.constant.SysRegionConstants;
import com.flossom.common.core.web.domain.AjaxResult;
import com.flossom.miniProgram.service.ISysRegionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
*
*/
@RestController
@RequestMapping("/region")
public class SysRegionController {
@Autowired
private ISysRegionService sysRegionService;
@GetMapping("/getProvince")
public AjaxResult getProvince() {
return AjaxResult.success(sysRegionService.selectSysAreaByPid(SysRegionConstants.PROVINCE_PID));
}
@GetMapping("/getAreaListByPid")
public AjaxResult getAreaListByPid(@RequestParam(value = "pid") Integer pid) {
if (pid == null) {
return AjaxResult.success();
}
return AjaxResult.success(sysRegionService.selectSysAreaByPid(pid));
}
}

@ -2,12 +2,10 @@ package com.flossom.miniProgram.controller;
import com.flossom.common.core.web.controller.BaseController;
import com.flossom.common.core.web.domain.AjaxResult;
import com.flossom.miniProgram.domain.vo.UserMemberUpdateVo;
import com.flossom.miniProgram.service.IWxUserMemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/wx/user")
@ -45,4 +43,15 @@ public class UserMemberController extends BaseController {
public AjaxResult upgradeMember(@RequestParam(value = "code") String code) throws Exception {
return wxUserMemberService.upgradeMember(code);
}
/**
*
*
* @return
*/
@PostMapping("/updateUser")
public AjaxResult updateUser(@RequestBody UserMemberUpdateVo userMemberUpdateVo) {
wxUserMemberService.updateUser(userMemberUpdateVo);
return AjaxResult.success();
}
}

@ -0,0 +1,41 @@
package com.flossom.miniProgram.domain.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.flossom.common.core.annotation.Excel;
import java.util.Date;
public class UserMemberUpdateVo {
/**
*
*/
private String nickname;
/**
*
*/
private String headimg;
/**
*
*/
private Integer province;
/**
*
*/
private Integer city;
/**
*
*/
private Integer area;
/**
*
*/
@JsonFormat(pattern = "yyyy-MM-dd")
private Date birthday;
}

@ -0,0 +1,10 @@
package com.flossom.miniProgram.service;
import com.flossom.hzMapper.domain.SysRegion;
import java.util.List;
public interface ISysRegionService {
List<SysRegion> selectSysAreaByPid(Integer pid);
}

@ -3,6 +3,7 @@ package com.flossom.miniProgram.service;
import com.flossom.common.core.web.domain.AjaxResult;
import com.flossom.hzMapper.domain.WxUserMember;
import com.flossom.miniProgram.domain.vo.LoginUserVo;
import com.flossom.miniProgram.domain.vo.UserMemberUpdateVo;
public interface IWxUserMemberService {
@ -11,4 +12,6 @@ public interface IWxUserMemberService {
LoginUserVo login(String code, String rawData, String signature) throws Exception;
AjaxResult upgradeMember(String code) throws Exception;
void updateUser(UserMemberUpdateVo userMemberUpdateVo);
}

@ -0,0 +1,23 @@
package com.flossom.miniProgram.service.impl;
import com.flossom.hzMapper.domain.SysRegion;
import com.flossom.hzMapper.mapper.SysRegionMapper;
import com.flossom.miniProgram.service.ISysRegionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class SysRegionServiceImpl implements ISysRegionService {
@Autowired
private SysRegionMapper sysRegionMapper;
@Override
public List<SysRegion> selectSysAreaByPid(Integer pid) {
return sysRegionMapper.selectSysAreaByPid(pid);
}
}

@ -12,6 +12,7 @@ import com.flossom.common.security.utils.SecurityUtils;
import com.flossom.hzMapper.domain.WxUserMember;
import com.flossom.hzMapper.mapper.WxUserMemberMapper;
import com.flossom.miniProgram.domain.vo.LoginUserVo;
import com.flossom.miniProgram.domain.vo.UserMemberUpdateVo;
import com.flossom.miniProgram.domain.vo.WxCode2PhoneRet;
import com.flossom.miniProgram.domain.vo.WxCode2SessionRet;
import com.flossom.miniProgram.service.IWxUserMemberService;
@ -90,13 +91,13 @@ public class WxUserMemberServiceImpl implements IWxUserMemberService {
WxCode2SessionRet wxCode2SessionRet = JSON.parseObject(MiniProgramUtils.getSessionKeyAndOpenId(code), WxCode2SessionRet.class);
if (200 != wxCode2SessionRet.getErrcode()) {
logger.error(wxCode2SessionRet.getErrmsg());
return null;
throw new ServiceException("校验失败");
}
// 2、校验签名 小程序发送的签名signature与服务器端生成的签名signature2 = sha1(rawData + sessionKey)
String signature2 = DigestUtils.sha1Hex(rawData + wxCode2SessionRet.getSession_key());
if (!signature.equals(signature2)) {
logger.error("签名校验失败code = {}", code);
return null;
throw new ServiceException("校验失败");
}
// 3、根据 openid 查询用户信息
@ -172,5 +173,12 @@ public class WxUserMemberServiceImpl implements IWxUserMemberService {
return AjaxResult.success();
}
@Override
public void updateUser(UserMemberUpdateVo userMemberUpdateVo) {
WxUserMember wxUserMember = new WxUserMember();
BeanUtils.copyProperties(userMemberUpdateVo, wxUserMember);
wxUserMemberMapper.updateWxUserMember(wxUserMember);
}
}

@ -0,0 +1,100 @@
package com.flossom.system.controller;
import javax.servlet.http.HttpServletResponse;
import com.flossom.common.core.utils.poi.ExcelUtil;
import com.flossom.common.core.web.controller.BaseController;
import com.flossom.common.core.web.domain.AjaxResult;
import com.flossom.common.core.web.page.TableDataInfo;
import com.flossom.common.log.annotation.Log;
import com.flossom.common.log.enums.BusinessType;
import com.flossom.common.security.annotation.RequiresPermissions;
import com.flossom.hzMapper.domain.SysRegion;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.flossom.system.service.ISysRegionService;
import java.util.List;
/**
* Controller
*
* @author flossom
* @date 2023-12-12
*/
@RestController
@RequestMapping("/region")
public class SysRegionController extends BaseController {
@Autowired
private ISysRegionService sysRegionService;
/**
*
*/
@RequiresPermissions("system:region:list")
@GetMapping("/list")
public TableDataInfo list(SysRegion sysRegion) {
startPage();
List<SysRegion> list = sysRegionService.selectSysRegionList(sysRegion);
return getDataTable(list);
}
/**
*
*/
@RequiresPermissions("system:region:export")
@Log(title = "地区列", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, SysRegion sysRegion) {
List<SysRegion> list = sysRegionService.selectSysRegionList(sysRegion);
ExcelUtil<SysRegion> util = new ExcelUtil<SysRegion>(SysRegion.class);
util.exportExcel(response, list, "地区列数据");
}
/**
*
*/
@RequiresPermissions("system:region:query")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id) {
return success(sysRegionService.selectSysRegionById(id));
}
/**
*
*/
@RequiresPermissions("system:region:add")
@Log(title = "地区列", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody SysRegion sysRegion) {
return toAjax(sysRegionService.insertSysRegion(sysRegion));
}
/**
*
*/
@RequiresPermissions("system:region:edit")
@Log(title = "地区列", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody SysRegion sysRegion) {
return toAjax(sysRegionService.updateSysRegion(sysRegion));
}
/**
*
*/
@RequiresPermissions("system:region:remove")
@Log(title = "地区列", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids) {
return toAjax(sysRegionService.deleteSysRegionByIds(ids));
}
}

@ -0,0 +1,62 @@
package com.flossom.system.service;
import com.flossom.hzMapper.domain.SysRegion;
import java.util.List;
/**
* Service
*
* @author flossom
* @date 2023-12-12
*/
public interface ISysRegionService {
/**
*
*
* @param id
* @return
*/
public SysRegion selectSysRegionById(Long id);
/**
*
*
* @param sysRegion
* @return
*/
public List<SysRegion> selectSysRegionList(SysRegion sysRegion);
/**
*
*
* @param sysRegion
* @return
*/
public int insertSysRegion(SysRegion sysRegion);
/**
*
*
* @param sysRegion
* @return
*/
public int updateSysRegion(SysRegion sysRegion);
/**
*
*
* @param ids
* @return
*/
public int deleteSysRegionByIds(Long[] ids);
/**
*
*
* @param id
* @return
*/
public int deleteSysRegionById(Long id);
}

@ -0,0 +1,88 @@
package com.flossom.system.service.impl;
import java.util.List;
import com.flossom.hzMapper.domain.SysRegion;
import com.flossom.hzMapper.mapper.SysRegionMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.flossom.system.service.ISysRegionService;
/**
* Service
*
* @author flossom
* @date 2023-12-12
*/
@Service
public class SysRegionServiceImpl implements ISysRegionService {
@Autowired
private SysRegionMapper sysRegionMapper;
/**
*
*
* @param id
* @return
*/
@Override
public SysRegion selectSysRegionById(Long id) {
return sysRegionMapper.selectSysRegionById(id);
}
/**
*
*
* @param sysRegion
* @return
*/
@Override
public List<SysRegion> selectSysRegionList(SysRegion sysRegion) {
return sysRegionMapper.selectSysRegionList(sysRegion);
}
/**
*
*
* @param sysRegion
* @return
*/
@Override
public int insertSysRegion(SysRegion sysRegion) {
return sysRegionMapper.insertSysRegion(sysRegion);
}
/**
*
*
* @param sysRegion
* @return
*/
@Override
public int updateSysRegion(SysRegion sysRegion) {
return sysRegionMapper.updateSysRegion(sysRegion);
}
/**
*
*
* @param ids
* @return
*/
@Override
public int deleteSysRegionByIds(Long[] ids) {
return sysRegionMapper.deleteSysRegionByIds(ids);
}
/**
*
*
* @param id
* @return
*/
@Override
public int deleteSysRegionById(Long id) {
return sysRegionMapper.deleteSysRegionById(id);
}
}
Loading…
Cancel
Save