管理员列表
parent
d7519b6019
commit
ffeb866b91
|
@ -1,19 +1,25 @@
|
|||
package cn.iocoder.mall.admin.application.controller;
|
||||
|
||||
import cn.iocoder.common.framework.vo.CommonResult;
|
||||
import cn.iocoder.mall.admin.api.AdminService;
|
||||
import cn.iocoder.mall.admin.api.ResourceService;
|
||||
import cn.iocoder.mall.admin.api.bo.AdminPageBO;
|
||||
import cn.iocoder.mall.admin.api.bo.ResourceBO;
|
||||
import cn.iocoder.mall.admin.api.constant.ResourceConstants;
|
||||
import cn.iocoder.mall.admin.api.dto.AdminPageDTO;
|
||||
import cn.iocoder.mall.admin.application.convert.AdminConvert;
|
||||
import cn.iocoder.mall.admin.application.convert.ResourceConvert;
|
||||
import cn.iocoder.mall.admin.application.vo.AdminMenuTreeNodeVO;
|
||||
import cn.iocoder.mall.admin.application.vo.AdminPageVO;
|
||||
import cn.iocoder.mall.admin.sdk.context.AdminSecurityContextHolder;
|
||||
import cn.iocoder.mall.admin.application.convert.AdminConvert;
|
||||
import cn.iocoder.mall.admin.application.vo.AdminInfoVO;
|
||||
import com.alibaba.dubbo.config.annotation.Reference;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiImplicitParam;
|
||||
import io.swagger.annotations.ApiImplicitParams;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
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;
|
||||
|
||||
import java.util.*;
|
||||
|
@ -26,11 +32,8 @@ public class AdminController {
|
|||
|
||||
@Reference(validation = "true")
|
||||
private ResourceService resourceService;
|
||||
|
||||
@GetMapping("/info")
|
||||
public CommonResult<AdminInfoVO> info() {
|
||||
return CommonResult.success(AdminConvert.INSTANCE.convert(AdminSecurityContextHolder.getContext()));
|
||||
}
|
||||
@Reference(validation = "true")
|
||||
private AdminService adminService;
|
||||
|
||||
// =========== 当前管理员相关的资源 API ===========
|
||||
|
||||
|
@ -69,4 +72,20 @@ public class AdminController {
|
|||
return CommonResult.success(resources.stream().map(ResourceBO::getHandler).collect(Collectors.toSet()));
|
||||
}
|
||||
|
||||
// =========== 管理员管理 API ===========
|
||||
|
||||
@GetMapping("/page")
|
||||
@ApiOperation(value = "管理员分页")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "nickname", value = "昵称,模糊匹配", required = true, example = "小王"),
|
||||
@ApiImplicitParam(name = "pageNo", value = "页码,从 0 开始", example = "0"),
|
||||
@ApiImplicitParam(name = "pageSize", value = "每页条数", required = true, example = "10"),
|
||||
})
|
||||
public CommonResult<AdminPageVO> page(@RequestParam(value = "nickname", required = false) String nickname,
|
||||
@RequestParam(value = "pageNo", defaultValue = "0") Integer pageNo,
|
||||
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
|
||||
CommonResult<AdminPageBO> result = adminService.getAdminPage(new AdminPageDTO().setNickname(nickname).setPageNo(pageNo).setPageSize(pageSize));
|
||||
return AdminConvert.INSTANCE.convert(result);
|
||||
}
|
||||
|
||||
}
|
|
@ -3,17 +3,17 @@ package cn.iocoder.mall.admin.application.controller;
|
|||
import cn.iocoder.common.framework.vo.CommonResult;
|
||||
import cn.iocoder.mall.admin.api.OAuth2Service;
|
||||
import cn.iocoder.mall.admin.api.bo.OAuth2AccessTokenBO;
|
||||
import cn.iocoder.mall.admin.application.convert.AdminConvert;
|
||||
import cn.iocoder.mall.admin.application.convert.PassportConvert;
|
||||
import cn.iocoder.mall.admin.application.vo.AdminInfoVO;
|
||||
import cn.iocoder.mall.admin.application.vo.PassportLoginVO;
|
||||
import cn.iocoder.mall.admin.sdk.context.AdminSecurityContextHolder;
|
||||
import com.alibaba.dubbo.config.annotation.Reference;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiImplicitParam;
|
||||
import io.swagger.annotations.ApiImplicitParams;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
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("admin/passport")
|
||||
|
@ -35,4 +35,10 @@ public class PassportController {
|
|||
return PassportConvert.INSTANCE.convert(result);
|
||||
}
|
||||
|
||||
// TODO 艿艿:后续继续完善
|
||||
@GetMapping("/info")
|
||||
public CommonResult<AdminInfoVO> info() {
|
||||
return CommonResult.success(AdminConvert.INSTANCE.convert(AdminSecurityContextHolder.getContext()));
|
||||
}
|
||||
|
||||
}
|
|
@ -31,8 +31,6 @@ public class ResourceController {
|
|||
@Reference(validation = "true")
|
||||
private ResourceService resourceService;
|
||||
|
||||
// =========== 资源管理 API ===========
|
||||
|
||||
@SuppressWarnings("Duplicates")
|
||||
@GetMapping("/tree")
|
||||
@ApiOperation(value = "获得所有资源,按照树形结构返回")
|
||||
|
|
|
@ -35,6 +35,11 @@ public class RoleController {
|
|||
|
||||
@GetMapping("/page")
|
||||
@ApiOperation(value = "角色分页")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "name", value = "角色名,模糊匹配", required = true, example = "系统管理员"),
|
||||
@ApiImplicitParam(name = "pageNo", value = "页码,从 0 开始", example = "0"),
|
||||
@ApiImplicitParam(name = "pageSize", value = "每页条数", required = true, example = "10"),
|
||||
})
|
||||
public CommonResult<RolePageVO> page(@RequestParam(value = "name", required = false) String name,
|
||||
@RequestParam(value = "pageNo", defaultValue = "0") Integer pageNo,
|
||||
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
|
||||
|
|
|
@ -1,7 +1,12 @@
|
|||
package cn.iocoder.mall.admin.application.convert;
|
||||
|
||||
import cn.iocoder.mall.admin.sdk.context.AdminSecurityContext;
|
||||
import cn.iocoder.common.framework.vo.CommonResult;
|
||||
import cn.iocoder.mall.admin.api.bo.AdminBO;
|
||||
import cn.iocoder.mall.admin.api.bo.AdminPageBO;
|
||||
import cn.iocoder.mall.admin.application.vo.AdminInfoVO;
|
||||
import cn.iocoder.mall.admin.application.vo.AdminPageVO;
|
||||
import cn.iocoder.mall.admin.application.vo.AdminVO;
|
||||
import cn.iocoder.mall.admin.sdk.context.AdminSecurityContext;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.Mappings;
|
||||
import org.mapstruct.factory.Mappers;
|
||||
|
@ -14,4 +19,10 @@ public interface AdminConvert {
|
|||
@Mappings({})
|
||||
AdminInfoVO convert(AdminSecurityContext adminSecurityContext);
|
||||
|
||||
@Mappings({})
|
||||
AdminVO convert(AdminBO adminBO);
|
||||
|
||||
@Mappings({})
|
||||
CommonResult<AdminPageVO> convert(CommonResult<AdminPageBO> result);
|
||||
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
package cn.iocoder.mall.admin.application.vo;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@ApiModel("管理员分页 VO")
|
||||
public class AdminPageVO {
|
||||
|
||||
@ApiModelProperty(value = "管理员数组")
|
||||
private List<AdminVO> admins;
|
||||
@ApiModelProperty(value = "管理员总数")
|
||||
private Integer count;
|
||||
|
||||
public List<AdminVO> getAdmins() {
|
||||
return admins;
|
||||
}
|
||||
|
||||
public AdminPageVO setAdmins(List<AdminVO> admins) {
|
||||
this.admins = admins;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Integer getCount() {
|
||||
return count;
|
||||
}
|
||||
|
||||
public AdminPageVO setCount(Integer count) {
|
||||
this.count = count;
|
||||
return this;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,67 @@
|
|||
package cn.iocoder.mall.admin.application.vo;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
@ApiModel("管理员 VO")
|
||||
public class AdminVO {
|
||||
|
||||
@ApiModelProperty(value = "管理员编号", required = true, example = "1")
|
||||
private Integer id;
|
||||
@ApiModelProperty(value = "登陆账号", required = true, example = "15601691300")
|
||||
private String username;
|
||||
@ApiModelProperty(value = "昵称", required = true, example = "小王")
|
||||
private String nickname;
|
||||
@ApiModelProperty(value = "账号状态", required = true, example = "1")
|
||||
private Integer status;
|
||||
@ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式")
|
||||
private Date createTime;
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public AdminVO setId(Integer id) {
|
||||
this.id = id;
|
||||
return this;
|
||||
}
|
||||
|
||||
public String getUsername() {
|
||||
return username;
|
||||
}
|
||||
|
||||
public AdminVO setUsername(String username) {
|
||||
this.username = username;
|
||||
return this;
|
||||
}
|
||||
|
||||
public String getNickname() {
|
||||
return nickname;
|
||||
}
|
||||
|
||||
public AdminVO setNickname(String nickname) {
|
||||
this.nickname = nickname;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Integer getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public AdminVO setStatus(Integer status) {
|
||||
this.status = status;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Date getCreateTime() {
|
||||
return createTime;
|
||||
}
|
||||
|
||||
public AdminVO setCreateTime(Date createTime) {
|
||||
this.createTime = createTime;
|
||||
return this;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,16 +1,11 @@
|
|||
package cn.iocoder.mall.admin.api;
|
||||
|
||||
import cn.iocoder.common.framework.vo.CommonResult;
|
||||
import cn.iocoder.mall.admin.api.bo.AdminPageBO;
|
||||
import cn.iocoder.mall.admin.api.dto.AdminPageDTO;
|
||||
|
||||
public interface AdminService {
|
||||
|
||||
// /**
|
||||
// * 创建用户。一般在用户注册时,调用该方法
|
||||
// *
|
||||
// * TODO 芋艿,此处要传递一些用户注册时的相关信息,例如说 ip、ua、客户端来源等等。用于数据分析、风控等等。
|
||||
// *
|
||||
// * @param mobile 手机号
|
||||
// * @param code 手机验证码
|
||||
// * @return 用户
|
||||
// */
|
||||
// UserBO createUser(String mobile, String code) throws ServiceException;
|
||||
CommonResult<AdminPageBO> getAdminPage(AdminPageDTO adminPageDTO);
|
||||
|
||||
}
|
|
@ -19,7 +19,7 @@ public interface OAuth2Service {
|
|||
CommonResult<OAuth2AuthenticationBO> checkToken(String accessToken);
|
||||
|
||||
/**
|
||||
* TODO 校验权限
|
||||
* 校验权限(鉴权)
|
||||
*
|
||||
* @param adminId 管理员编号
|
||||
* @param roleIds 管理员拥有的角色编号的集合
|
||||
|
|
|
@ -0,0 +1,72 @@
|
|||
package cn.iocoder.mall.admin.api.bo;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
public class AdminBO {
|
||||
|
||||
/**
|
||||
* 管理员编号
|
||||
*/
|
||||
private Integer id;
|
||||
/**
|
||||
* 登陆账号
|
||||
*/
|
||||
private String username;
|
||||
/**
|
||||
* 昵称
|
||||
*/
|
||||
private String nickname;
|
||||
/**
|
||||
* 账号状态
|
||||
*/
|
||||
private Integer status;
|
||||
/**
|
||||
* 创建时间
|
||||
*/
|
||||
private Date createTime;
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public AdminBO setId(Integer id) {
|
||||
this.id = id;
|
||||
return this;
|
||||
}
|
||||
|
||||
public String getUsername() {
|
||||
return username;
|
||||
}
|
||||
|
||||
public AdminBO setUsername(String username) {
|
||||
this.username = username;
|
||||
return this;
|
||||
}
|
||||
|
||||
public String getNickname() {
|
||||
return nickname;
|
||||
}
|
||||
|
||||
public AdminBO setNickname(String nickname) {
|
||||
this.nickname = nickname;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Integer getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public AdminBO setStatus(Integer status) {
|
||||
this.status = status;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Date getCreateTime() {
|
||||
return createTime;
|
||||
}
|
||||
|
||||
public AdminBO setCreateTime(Date createTime) {
|
||||
this.createTime = createTime;
|
||||
return this;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
package cn.iocoder.mall.admin.api.bo;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class AdminPageBO {
|
||||
|
||||
/**
|
||||
* 管理员数组
|
||||
*/
|
||||
private List<AdminBO> admins;
|
||||
/**
|
||||
* 总量
|
||||
*/
|
||||
private Integer count;
|
||||
|
||||
public List<AdminBO> getAdmins() {
|
||||
return admins;
|
||||
}
|
||||
|
||||
public AdminPageBO setAdmins(List<AdminBO> admins) {
|
||||
this.admins = admins;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Integer getCount() {
|
||||
return count;
|
||||
}
|
||||
|
||||
public AdminPageBO setCount(Integer count) {
|
||||
this.count = count;
|
||||
return this;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
package cn.iocoder.mall.admin.api.dto;
|
||||
|
||||
public class AdminPageDTO {
|
||||
|
||||
private String nickname;
|
||||
|
||||
private Integer pageNo;
|
||||
private Integer pageSize;
|
||||
|
||||
public Integer getPageNo() {
|
||||
return pageNo;
|
||||
}
|
||||
|
||||
public AdminPageDTO setPageNo(Integer pageNo) {
|
||||
this.pageNo = pageNo;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Integer getPageSize() {
|
||||
return pageSize;
|
||||
}
|
||||
|
||||
public AdminPageDTO setPageSize(Integer pageSize) {
|
||||
this.pageSize = pageSize;
|
||||
return this;
|
||||
}
|
||||
|
||||
public String getNickname() {
|
||||
return nickname;
|
||||
}
|
||||
|
||||
public AdminPageDTO setNickname(String nickname) {
|
||||
this.nickname = nickname;
|
||||
return this;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
package cn.iocoder.mall.admin.convert;
|
||||
|
||||
import cn.iocoder.mall.admin.api.bo.AdminBO;
|
||||
import cn.iocoder.mall.admin.dataobject.AdminDO;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.Mappings;
|
||||
import org.mapstruct.factory.Mappers;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Mapper
|
||||
public interface AdminConvert {
|
||||
|
||||
AdminConvert INSTANCE = Mappers.getMapper(AdminConvert.class);
|
||||
|
||||
@Mappings({})
|
||||
AdminBO convert(AdminDO adminDO);
|
||||
|
||||
@Mappings({})
|
||||
List<AdminBO> convert(List<AdminDO> adminBOs);
|
||||
|
||||
}
|
|
@ -4,9 +4,17 @@ import cn.iocoder.mall.admin.dataobject.AdminDO;
|
|||
import org.apache.ibatis.annotations.Param;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Repository
|
||||
public interface AdminMapper {
|
||||
|
||||
AdminDO selectByUsername(@Param("username") String username);
|
||||
|
||||
List<AdminDO> selectListByNicknameLike(@Param("nickname") String nickname,
|
||||
@Param("offset") Integer offset,
|
||||
@Param("limit") Integer limit);
|
||||
|
||||
Integer selectCountByNicknameLike(@Param("nickname") String nickname);
|
||||
|
||||
}
|
|
@ -1,11 +1,11 @@
|
|||
package cn.iocoder.mall.admin.dataobject;
|
||||
|
||||
import java.util.Date;
|
||||
import cn.iocoder.common.framework.dataobject.BaseDO;
|
||||
|
||||
/**
|
||||
* 管理员实体
|
||||
*/
|
||||
public class AdminDO {
|
||||
public class AdminDO extends BaseDO {
|
||||
|
||||
/**
|
||||
* 账号状态 - 开启
|
||||
|
@ -34,10 +34,6 @@ public class AdminDO {
|
|||
* TODO 芋艿 暂时最简单的 MD5
|
||||
*/
|
||||
private String password;
|
||||
/**
|
||||
* 创建时间
|
||||
*/
|
||||
private Date createTime;
|
||||
/**
|
||||
* 账号状态
|
||||
*/
|
||||
|
@ -79,15 +75,6 @@ public class AdminDO {
|
|||
return this;
|
||||
}
|
||||
|
||||
public Date getCreateTime() {
|
||||
return createTime;
|
||||
}
|
||||
|
||||
public AdminDO setCreateTime(Date createTime) {
|
||||
this.createTime = createTime;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Integer getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
|
|
@ -3,7 +3,10 @@ package cn.iocoder.mall.admin.service;
|
|||
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
|
||||
import cn.iocoder.common.framework.vo.CommonResult;
|
||||
import cn.iocoder.mall.admin.api.AdminService;
|
||||
import cn.iocoder.mall.admin.api.bo.AdminPageBO;
|
||||
import cn.iocoder.mall.admin.api.constant.AdminErrorCodeEnum;
|
||||
import cn.iocoder.mall.admin.api.dto.AdminPageDTO;
|
||||
import cn.iocoder.mall.admin.convert.AdminConvert;
|
||||
import cn.iocoder.mall.admin.dataobject.AdminDO;
|
||||
import cn.iocoder.mall.admin.dao.AdminMapper;
|
||||
import cn.iocoder.mall.admin.dao.AdminRoleMapper;
|
||||
|
@ -47,4 +50,16 @@ public class AdminServiceImpl implements AdminService {
|
|||
return adminRoleMapper.selectByAdminId(adminId);
|
||||
}
|
||||
|
||||
}
|
||||
@Override
|
||||
public CommonResult<AdminPageBO> getAdminPage(AdminPageDTO adminPageDTO) {
|
||||
AdminPageBO adminPage = new AdminPageBO();
|
||||
// 查询分页数据
|
||||
int offset = adminPageDTO.getPageNo() * adminPageDTO.getPageSize();
|
||||
adminPage.setAdmins(AdminConvert.INSTANCE.convert(adminMapper.selectListByNicknameLike(adminPageDTO.getNickname(),
|
||||
offset, adminPageDTO.getPageSize())));
|
||||
// 查询分页总数
|
||||
adminPage.setCount(adminMapper.selectCountByNicknameLike(adminPageDTO.getNickname()));
|
||||
return CommonResult.success(adminPage);
|
||||
}
|
||||
|
||||
}
|
|
@ -2,19 +2,42 @@
|
|||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="cn.iocoder.mall.admin.dao.AdminMapper">
|
||||
|
||||
<!--<insert id="insert" parameterType="UserDO" useGeneratedKeys="true" keyProperty="id">-->
|
||||
<!--INSERT INTO users (-->
|
||||
<!--id, mobile, create_time-->
|
||||
<!--) VALUES (-->
|
||||
<!--#{id}, #{mobile}, #{createTime}-->
|
||||
<!--)-->
|
||||
<!--</insert>-->
|
||||
<sql id="FIELDS">
|
||||
id, username, nickname, password, status,
|
||||
create_time
|
||||
</sql>
|
||||
|
||||
<select id="selectByUsername" parameterType="String" resultType="AdminDO">
|
||||
SELECT
|
||||
id, username, nickname, password, status
|
||||
FROM admin
|
||||
WHERE username = #{username}
|
||||
SELECT
|
||||
<include refid="FIELDS" />
|
||||
FROM admin
|
||||
WHERE username = #{username}
|
||||
AND deleted = 0
|
||||
</select>
|
||||
|
||||
<select id="selectListByNicknameLike" resultType="AdminDO">
|
||||
SELECT
|
||||
<include refid="FIELDS" />
|
||||
FROM admin
|
||||
<where>
|
||||
<if test="nickname != null">
|
||||
nickname LIKE "%"#{nickname}"%"
|
||||
</if>
|
||||
AND deleted = 0
|
||||
</where>
|
||||
LIMIT #{offset}, #{limit}
|
||||
</select>
|
||||
|
||||
<select id="selectCountByNicknameLike" resultType="Integer">
|
||||
SELECT
|
||||
COUNT(1)
|
||||
FROM admin
|
||||
<where>
|
||||
<if test="nickname != null">
|
||||
nickname LIKE "%"#{nickname}"%"
|
||||
</if>
|
||||
AND deleted = 0
|
||||
</where>
|
||||
</select>
|
||||
|
||||
</mapper>
|
|
@ -39,11 +39,12 @@
|
|||
<if test="name != null">
|
||||
name LIKE "%"#{name}"%"
|
||||
</if>
|
||||
AND deleted = 0
|
||||
</where>
|
||||
LIMIT #{offset}, #{limit}
|
||||
</select>
|
||||
|
||||
<select id="selectCountByNameLike" resultType="RoleDO">
|
||||
<select id="selectCountByNameLike" resultType="Integer">
|
||||
SELECT
|
||||
COUNT(1)
|
||||
FROM role
|
||||
|
@ -51,6 +52,7 @@
|
|||
<if test="name != null">
|
||||
name LIKE "%"#{name}"%"
|
||||
</if>
|
||||
AND deleted = 0
|
||||
</where>
|
||||
</select>
|
||||
|
||||
|
|
Loading…
Reference in New Issue