青城
9 天以前 bd9b6a58beb6b478ad27d645aa1cc0da99c25d7d
协调审批
已修改17个文件
已添加1个文件
219 ■■■■ 文件已修改
src/main/java/com/ruoyi/approve/controller/ApproveNodeController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/controller/ApproveProcessController.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/mapper/ApproveNodeMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/mapper/ApproveProcessMapper.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/pojo/ApproveNode.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/IApproveNodeService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/IApproveProcessService.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java 66 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/utils/DailyRedisCounter.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/vo/ApproveGetAndUpdateVo.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/vo/ApproveNodeVo.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/framework/security/service/TokenService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/service/ISysUserDeptService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/service/impl/SysUserDeptServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/controller/ApproveNodeController.java
@@ -2,6 +2,7 @@
import com.ruoyi.approve.pojo.ApproveNode;
import com.ruoyi.approve.service.IApproveNodeService;
import com.ruoyi.approve.vo.ApproveNodeVo;
import com.ruoyi.framework.web.domain.AjaxResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@@ -23,12 +24,12 @@
    }
    /**
     * å®¡æ‰¹èŠ‚ç‚¹
     * æ›´æ–°å®¡æ‰¹èŠ‚ç‚¹
     * @param approveNode
     * @return
     */
    @PostMapping("/updateApproveNode")
    public AjaxResult updateApproveNode(@RequestBody ApproveNode approveNode) {
    public AjaxResult updateApproveNode(@RequestBody ApproveNodeVo approveNode) {
        approveNodeService.updateApproveNode(approveNode);
        return AjaxResult.success();
    }
src/main/java/com/ruoyi/approve/controller/ApproveProcessController.java
@@ -1,5 +1,6 @@
package com.ruoyi.approve.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.approve.service.IApproveProcessService;
import com.ruoyi.approve.vo.ApproveGetAndUpdateVo;
import com.ruoyi.approve.vo.ApproveProcessVO;
@@ -7,6 +8,10 @@
import com.ruoyi.framework.security.LoginUser;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.project.system.domain.SysDept;
import com.ruoyi.project.system.domain.SysUserDept;
import com.ruoyi.project.system.mapper.SysDeptMapper;
import com.ruoyi.project.system.mapper.SysUserDeptMapper;
import com.ruoyi.project.system.service.ISysUserDeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@@ -25,6 +30,8 @@
    @Autowired
    private IApproveProcessService approveProcessService;
    @Autowired
    private ISysUserDeptService sysUserDeptService;
    /**、
     * èŽ·å–éƒ¨é—¨åˆ—è¡¨
     * @return
@@ -32,9 +39,8 @@
    @GetMapping("/getDept")
    public AjaxResult getDept() {
        Long userId = SecurityUtils.getUserId();
        LoginUser user = SecurityUtils.getLoginUser();
        Long[] deptIds = SecurityUtils.getDeptId();
        List<SysUserDept> userDeptList = sysUserDeptService.getUserDeptList(userId);
        Long[] deptIds = userDeptList.stream().map(SysUserDept::getDeptId).toArray(Long[]::new);
        List<SysDept> sysDeptList = approveProcessService.selectDeptListByDeptIds(deptIds);
        return AjaxResult.success(sysDeptList);
    }
@@ -60,7 +66,7 @@
     * @return
     */
    @GetMapping("/get")
    public AjaxResult get(@RequestBody ApproveGetAndUpdateVo approveGetAndUpdateVo){
    public AjaxResult get(ApproveGetAndUpdateVo approveGetAndUpdateVo){
        if (approveGetAndUpdateVo.getId() == null || approveGetAndUpdateVo.getId().isEmpty()) {
            return AjaxResult.warn("参数不能为空");
        }
@@ -81,12 +87,12 @@
        return AjaxResult.success("操作成功");
    }
    /**
     * èŽ·å–å®¡æ‰¹åˆ—è¡¨
     * èŽ·å–å®¡æ‰¹åˆ—è¡¨--分页查询
     * @return
     */
    @GetMapping("/list")
    public AjaxResult list() {
        return AjaxResult.success(approveProcessService.listAll());
    public AjaxResult list(Page page) {
        return AjaxResult.success(approveProcessService.listAll(page));
    }
    /**
@@ -94,7 +100,7 @@
     * @param ids
     * @return
     */
    @PostMapping("/deleteIds")
    @RequestMapping ("/deleteIds")
    public AjaxResult deleteIds(@RequestBody Long[] ids) {
        if (ids == null || ids.length == 0) {
            return AjaxResult.warn("参数不能为空");
src/main/java/com/ruoyi/approve/mapper/ApproveNodeMapper.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.approve.pojo.ApproveNode;
import org.apache.ibatis.annotations.Mapper;
/**
* @author Administrator
@@ -9,6 +10,7 @@
* @createDate 2025-07-08 16:50:15
* @Entity com.ruoyi.approve.pojo.ApproveNode
*/
@Mapper
public interface ApproveNodeMapper extends BaseMapper<ApproveNode> {
}
src/main/java/com/ruoyi/approve/mapper/ApproveProcessMapper.java
@@ -2,13 +2,15 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.approve.pojo.ApproveProcess;
import org.apache.ibatis.annotations.Mapper;
/**
* @author Administrator
* @description é’ˆå¯¹è¡¨ã€approve_process(审批流程表)】的数据库操作Mapper
* @createDate 2025-07-08 16:44:05
* @createDate 2025-07-09 13:52:01
* @Entity com.ruoyi.approve.pojo.ApproveProcess
*/
@Mapper
public interface ApproveProcessMapper extends BaseMapper<ApproveProcess> {
}
src/main/java/com/ruoyi/approve/pojo/ApproveNode.java
@@ -3,8 +3,7 @@
import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
@@ -13,10 +12,12 @@
 * @TableName approve_node
 */
@Data
@TableName(value ="approve_node")
public class ApproveNode implements Serializable {
    /**
     * 
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java
@@ -11,8 +11,8 @@
 * å®¡æ‰¹æµç¨‹è¡¨
 * @TableName approve_process
 */
@TableName(value ="approve_process")
@Data
@TableName("approve_process")
public class ApproveProcess implements Serializable {
    /**
     * 
@@ -41,14 +41,24 @@
    private String approveDeptName;
    /**
     * ç”³è¯·ç”¨æˆ·ids
     * å®¡æ‰¹ç”¨æˆ·ids
     */
    private String approveUserIds;
    /**
     * ç”³è¯·ç”¨æˆ·åç§°
     * å®¡æ‰¹ç”¨æˆ·åç§°
     */
    private String approveUserNames;
    /**
     * å½“前审批用户id
     */
    private Long approveUserCurrentId;
    /**
     * å½“前审批用户名称
     */
    private String approveUserCurrentName;
    /**
     * ç”³è¯·åŽŸå› 
@@ -68,7 +78,7 @@
    private Date approveOverTime;
    /**
     * å®¡æ‰¹çŠ¶æ€ï¼š0待审核,1审核中,2审核完成
     * å®¡æ‰¹çŠ¶æ€ï¼š0待审核,1审核中,2审核完成 3审核不通过
     */
    private Integer approveStatus;
@@ -93,6 +103,7 @@
     */
    private String approveRemark;
    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
src/main/java/com/ruoyi/approve/service/IApproveNodeService.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.approve.pojo.ApproveNode;
import com.ruoyi.approve.vo.ApproveNodeVo;
import java.util.List;
@@ -14,5 +15,5 @@
     */
    List<ApproveNode> details(String id);
    void updateApproveNode(ApproveNode approveNode);
    void updateApproveNode(ApproveNodeVo approveNode);
}
src/main/java/com/ruoyi/approve/service/IApproveProcessService.java
@@ -1,9 +1,12 @@
package com.ruoyi.approve.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.approve.pojo.ApproveNode;
import com.ruoyi.approve.pojo.ApproveProcess;
import com.ruoyi.approve.vo.ApproveGetAndUpdateVo;
import com.ruoyi.approve.vo.ApproveNodeVo;
import com.ruoyi.approve.vo.ApproveProcessVO;
import com.ruoyi.project.system.domain.SysDept;
@@ -21,7 +24,7 @@
     */
    List<SysDept> selectDeptListByDeptIds(Long[] deptIds);
    List<ApproveProcess> listAll();
    IPage<ApproveProcess> listAll(Page page);
    void delApprove(Long[] ids);
@@ -33,5 +36,5 @@
     * å®¡æ‰¹çŠ¶æ€æ›´æ–°
     * @param approveNode
     */
    void updateApproveProcessStatus(ApproveNode approveNode);
    void updateApproveProcessStatus(ApproveNodeVo approveNode);
}
src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
@@ -7,6 +7,7 @@
import com.ruoyi.approve.pojo.ApproveProcess;
import com.ruoyi.approve.service.IApproveNodeService;
import com.ruoyi.approve.service.IApproveProcessService;
import com.ruoyi.approve.vo.ApproveNodeVo;
import com.ruoyi.common.utils.SecurityUtils;
import lombok.AllArgsConstructor;
import lombok.RequiredArgsConstructor;
@@ -63,12 +64,30 @@
    }
    @Override
    public void updateApproveNode(ApproveNode approveNode) {
    public void updateApproveNode(ApproveNodeVo approveNode) {
        //某个节点审批不通过
        if(approveNode.getApproveNodeStatus().intValue()==2){
            //修改审批流程
            ApproveNode node = approveNodeMapper.selectById(approveNode.getId());
            Long approveProcessId = node.getApproveProcessId();
            ApproveProcess approveProcess = approveProcessService.getBaseMapper().selectById(approveProcessId);
            approveProcess.setApproveOverTime(new Date());
            approveProcess.setApproveStatus(3);
            approveProcessService.saveOrUpdate(approveProcess);
            //审批节点状态改变
            initApproveNodes(approveProcess.getApproveId());
            return;
        }
        //更新审批流程
         approveProcessService.updateApproveProcessStatus(approveNode);
        approveNode.setApproveNodeTime(new Date());
        approveNodeMapper.updateById(approveNode);
        //审批流程当前审批人修改
        ApproveNode node = getById(approveNode.getId());
        node.setApproveNodeTime(new Date());
        node.setApproveNodeStatus(approveNode.getApproveNodeStatus());
        approveNodeMapper.updateById(node);
    }
}
src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
@@ -1,6 +1,8 @@
package com.ruoyi.approve.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.approve.mapper.ApproveProcessMapper;
import com.ruoyi.approve.pojo.ApproveNode;
@@ -9,10 +11,13 @@
import com.ruoyi.approve.service.IApproveProcessService;
import com.ruoyi.approve.utils.DailyRedisCounter;
import com.ruoyi.approve.vo.ApproveGetAndUpdateVo;
import com.ruoyi.approve.vo.ApproveNodeVo;
import com.ruoyi.approve.vo.ApproveProcessVO;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.project.system.domain.SysDept;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysDeptMapper;
import com.ruoyi.project.system.mapper.SysUserMapper;
import lombok.AllArgsConstructor;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
@@ -23,6 +28,7 @@
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
@@ -37,6 +43,8 @@
    private final SysDeptMapper sysDeptMapper;
    private final IApproveNodeService approveNodeService;
    private final SysUserMapper sysUserMapper;
    private final ApproveProcessMapper approveProcessMapper;
    @Override
    public void addApprove(ApproveProcessVO approveProcessVO) {
@@ -50,11 +58,21 @@
        //流程 ID
        String approveID = today + formattedCount;
        //审批人姓名处理
        String approverIds = approveProcessVO.getApproverIds();
        String[] idArray = approverIds.split(",");
        String approverNames = getApproverNames(approveProcessVO.getApproverIds());
        String[] namdArray = approverIds.split(",");
        ApproveProcess approveProcess = new ApproveProcess();
        approveProcess.setApproveId(approveID);
        approveProcess.setApproveUser(userId);
        approveProcess.setApproveDeptName(approveProcessVO.getDeptName());
        approveProcess.setApproveUserNames(approveProcessVO.getApproverNames());
        approveProcess.setApproveDeptId(approveProcessVO.getApproveDeptId());
      //  approveProcess.setApproveDeptName(approveProcessVO.getDeptName());
        approveProcess.setApproveUserIds(approveProcessVO.getApproverIds());
        approveProcess.setApproveUserNames(approverNames);
        approveProcess.setApproveUserCurrentId(Long.parseLong(idArray[0]));
        approveProcess.setApproveUserCurrentName(namdArray[0]);
        approveProcess.setApproveTime(new Date());
        approveProcess.setApproveReason(approveProcessVO.getApproveReason());
        approveProcess.setApproveOverTime(null);
@@ -67,6 +85,22 @@
        approveNodeService.initApproveNodes(approveID);
    }
    private String getApproverNames(String approverIds) {
        String[] idArray = approverIds.split(",");
        Integer[] ids = Arrays.stream(idArray)
                .map(Integer::parseInt)
                .toArray(Integer[]::new);
        String names = "";
        StringBuilder stringBuilder = new StringBuilder();
        for (Integer id : ids) {
            SysUser sysUser = sysUserMapper.selectUserById(id.longValue());
                names = stringBuilder + "," + sysUser.getUserName();
        }
        return names;
    }
    @Override
    public List<SysDept> selectDeptListByDeptIds(Long[] deptIds) {
        List<SysDept> sysDeptList =new ArrayList<SysDept>();
@@ -78,17 +112,17 @@
    }
    @Override
    public List<ApproveProcess> listAll() {
    public IPage<ApproveProcess> listAll(Page page) {
        LambdaQueryWrapper<ApproveProcess> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ApproveProcess::getApproveDelete, 0);
        return list(queryWrapper);
        return approveProcessMapper.selectPage(page, queryWrapper);
    }
    @Override
    public void delApprove(Long[] ids) {
        for (Long id : ids) {
            LambdaQueryWrapper<ApproveProcess> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.eq(ApproveProcess::getApproveId, id);
            queryWrapper.eq(ApproveProcess::getApproveDelete, 1);
            update(queryWrapper);
        }
    }
@@ -102,18 +136,28 @@
    }
    @Override
    public void updateApproveProcessStatus(ApproveNode approveNode) {
        ApproveProcess approveProcess = getById(approveNode.getApproveProcessId());
        if(approveNode.getIsFirst()){
            if(approveNode.getApproveNodeStatus() == 1){
    public void updateApproveProcessStatus(ApproveNodeVo approveNodeVo) {
        ApproveNode node = approveNodeService.getById(approveNodeVo.getId());
        ApproveProcess approveProcess = getById(node.getApproveProcessId());
        String[] idArray = approveProcess.getApproveUserIds().split(",");
        String[] nameArray = approveProcess.getApproveUserNames().split(",");
        Integer noderOrder = approveNodeVo.getApproveNodeOrder();
        approveProcess.setApproveUserCurrentId(Long.parseLong(idArray[noderOrder]));
        approveProcess.setApproveUserCurrentName(nameArray[noderOrder]);
        if(noderOrder.equals(1)){
            if(approveNodeVo.getApproveNodeStatus() == 1){
                approveProcess.setApproveStatus(1);
            }
        }
        if(approveNode.getIsLast()){
            if(approveNode.getApproveNodeStatus() == 1){
        if(noderOrder.equals(idArray.length)){
            if(approveNodeVo.getApproveNodeStatus() == 1){
                approveProcess.setApproveStatus(2);
            }
        }
        updateById(approveProcess);
    }
src/main/java/com/ruoyi/approve/utils/DailyRedisCounter.java
@@ -31,10 +31,10 @@
        long count = redisTemplate.opsForValue().increment(key, 1);
        // ä»…在第一次设置时设置过期时间(避免重复设置)
        if (count == 1) {
            long secondsUntilMidnight = calculateSecondsUntilMidnight();
            redisTemplate.expire(key, secondsUntilMidnight, TimeUnit.SECONDS);
        }
//        if (count == 0) {
//            long secondsUntilMidnight = calculateSecondsUntilMidnight();
//            redisTemplate.expire(key, secondsUntilMidnight, TimeUnit.SECONDS);
//        }
        return count;
    }
src/main/java/com/ruoyi/approve/vo/ApproveGetAndUpdateVo.java
@@ -7,9 +7,8 @@
@Data
public class ApproveGetAndUpdateVo {
    //审批id
    @NotBlank(message = "流程编号不能为空")
   // @NotBlank(message = "流程编号不能为空")
    private String id;
    //申请事由
    @NotBlank(message = "申请事由不能为空")
    private String approveReason;
}
src/main/java/com/ruoyi/approve/vo/ApproveNodeVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.ruoyi.approve.vo;
import lombok.Data;
import javax.validation.constraints.NotNull;
@Data
public class ApproveNodeVo {
    @NotNull
    //流程节点id
    private Long id;
    //流程节点顺序
    private Integer approveNodeOrder;
    /**
     * å®¡æ‰¹èŠ‚ç‚¹çŠ¶æ€:1同意,2拒绝,0尚未审核(默认为0)
     */
    private Integer approveNodeStatus;
}
src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java
@@ -8,16 +8,13 @@
public class ApproveProcessVO {
    //部门id
  //  private Long deptId;
    private Long approveDeptId;
    //部门名称
    @NotBlank(message = "部门名称不能为空")
    private String deptName;
    //private String deptName;
    //审批人 ids
 //   private String approverIds;
    private String approverIds;
    //审批人名称
    @NotBlank(message = "审批人不能为空")
    private String approverNames;
    //private String approverNames;
    //审批事由
    @NotBlank(message = "11")
    private String approveReason;
}
src/main/java/com/ruoyi/framework/security/service/TokenService.java
@@ -148,6 +148,7 @@
    public void refreshToken(LoginUser loginUser)
    {
        loginUser.setLoginTime(System.currentTimeMillis());
        loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE);
        // æ ¹æ®uuid将loginUser缓存
        String userKey = getTokenKey(loginUser.getToken());
src/main/java/com/ruoyi/project/system/service/ISysUserDeptService.java
@@ -1,5 +1,6 @@
package com.ruoyi.project.system.service;
import com.ruoyi.project.system.domain.SysUserDept;
import com.ruoyi.project.system.domain.vo.SysUserDeptVo;
import java.util.List;
@@ -7,4 +8,6 @@
public interface ISysUserDeptService {
    List<SysUserDeptVo> userLoginFacotryList(SysUserDeptVo userDeptVo);
    List<SysUserDept> getUserDeptList(Long userId);
}
src/main/java/com/ruoyi/project/system/service/impl/SysUserDeptServiceImpl.java
@@ -1,11 +1,14 @@
package com.ruoyi.project.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.project.system.domain.SysUserDept;
import com.ruoyi.project.system.domain.vo.SysUserDeptVo;
import com.ruoyi.project.system.mapper.SysUserDeptMapper;
import com.ruoyi.project.system.service.ISysUserDeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List;
@Service
@@ -18,4 +21,11 @@
    public List<SysUserDeptVo> userLoginFacotryList(SysUserDeptVo userDeptVo) {
        return sysUserDeptMapper.userLoginFacotryList(userDeptVo);
    }
    @Override
    public List<SysUserDept> getUserDeptList(Long userId) {
        LambdaQueryWrapper<SysUserDept> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(SysUserDept::getUserId, userId);
        return sysUserDeptMapper.selectList(queryWrapper);
    }
}
src/main/resources/application.yml
@@ -81,9 +81,9 @@
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6379
    # æ•°æ®åº“索引
    database: 0
    database: 1
    # å¯†ç 
    password:
#    password:
#    password: 123456
    # è¿žæŽ¥è¶…æ—¶æ—¶é—´