2024/4/3 工作总结

上周总结需要解决的问题:
  1. sn加上结束地址
  2. 文件上传和下载不采用服务器,改成本地操作
  3. 项目经理申请订单时,要能同时上传多个类型的key
  4. 项目经理只能看到自己的项目
  5. 订单页展示各类型key名称,支持下载
  6. 给订单生成MD5码
  7. 邮箱点击下拉,弹出历史选项

问题4遗留问题

当时草率了,只在项目中加上用户id,登录时判断是否是当前用户,但是忘了一个问题,并不是所有用户都是项目经理,其他用户比如管理员、操作员(执行加密操作),这些角色应该都能看到所有订单,所以,在查询所有订单时,需要先判断当前用户是否具有项目经理角色才进行过滤。

@Override
    public AjaxResult selectOrderList(Order order)
    {
        // 获取当前用户编号
        Long userId = SecurityUtils.getUserId();
        List<Long> roleIds = userRoleMapper.selectRoleIdsByUserId(userId);
        List<String> roleNames = roleIds.stream().map(roleId -> roleService.selectRoleById(roleId).getRoleName()).collect(Collectors.toList());
        // 根据项目id关联到所有数据封装到orderList中
        List<Order> orders = new ArrayList<>();
        List<SdmcProject> projects = projectService.selectSdmcProjectList(new SdmcProject());
        for (SdmcProject project : projects) {
            // 如果登录用户角色是项目经理的话,才需要判断
            if (roleNames.contains(PROJECT_MANAGER) && !Objects.equals(project.getUserId(), userId)){
                continue;
            }
           // 。。。。。。。。。。。
        return result;
    }

在创建项目时就应该给项目分配项目经理;

问题7

关于邮箱弹框发送,最开始的方案并没有给一个对话框,而是用ElementUI提供的自定义弹框

首先提示用户输入收件人邮箱
        this.$prompt('请输入收件人邮箱', '提示', {
          inputPattern: /[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?/,
          inputErrorMessage: '邮箱格式不正确'
        }).then(({ value }) => {
          this.address = value; // 保存用户输入的邮箱地址
          this.$message({
            type: 'success',
            message: '正在通知: ' + value
          });

          // 执行 addKey 操作
          addKey(this.formData).then(response => {
            if (response.code === 200) {
              // 如果 addKey 成功,才执行 addSn 操作
              this.formData.snCount = this.formData.keyCount; // sn个数与key个数统一
              return addSn(this.formData); // addSn 也返回一个 Promise
            }
          }).then(resp => {
            if (resp.code === 200) {
              this.$alert("提交成功");
              this.resetForm();
              // 发送邮件
              sendEmail({
                address: this.address,
                subject: "收到key文件",
                content: `key文件已上传,请及时处理,key名称为:    ${this.keyName[0]}、${this.keyName[1]}、${this.keyName[2]}`
              }).then(res => {
                if (res.code === 200) {
                  this.$alert("发送成功,等待收件人处理");
                }
              });
            }
          }).catch(error => {
            // 如果 addKey 或 addSn 失败,执行这里的代码
            this.$message.error("提交过程中发生错误: " + error);
            // 可以选择在这里重置 address 或保持它,取决于你的需求
          });
        }).catch(() => {
          // 用户点击了取消按钮或输入框被关闭
          this.$message({
            type: 'info',
            message: '取消输入'
          });
          // 可以选择在这里重置 address 或保持它,取决于你的需求
        });

并没有在页面编写时给定一个<el-dialog>而是通过方法弹出,这样没法监听输入框的点击动作。

 <el-dialog title="收件人邮箱" width="400px" :visible.sync="dialogFormVisible">
      <el-select filterable
                 allow-create
                 v-model="address"
                 placeholder="请输入收件人邮箱">
        <el-option
          v-for="item in historyEmails"
          :key="item.userEmail"
          :label="item.userName"
          :value="item.userEmail">
          <span style="float: left">{{ item.userName }}</span>
          <span style="float: right; color: #8492a6; font-size: 13px">{{ item.userEmail }}</span>
        </el-option>
      </el-select>
      <div slot="footer" class="dialog-footer">
        <el-button @click="dialogFormVisible = false">取 消</el-button>
        <el-button type="primary" @click="handleSendEmail">确 定</el-button>
      </div>
    </el-dialog>

监听点击方法

handleSendEmail(){
      this.$message({
            type: 'success',
            message: '正在通知: ' + this.address
          });
      // 执行 addKey 操作
      addKey(this.formData).then(response => {
        if (response.code === 200) {
          // 如果 addKey 成功,才执行 addSn 操作
          this.keyBaseUrlfileList = [];
          this.formData.snCount = this.formData.keyCount; // sn个数与key个数统一
          return addSn(this.formData); // addSn 也返回一个 Promise
        }
      }).then(resp => {
        if (resp.code === 200) {
          this.$alert("提交成功");
          this.resetForm();
          // 发送邮件
          sendEmail({
            address: this.address,
            subject: "收到key文件",
            content: `key文件已上传,请及时处理,key名称为:    ${this.keyName[0]}、${this.keyName[1]}、${this.keyName[2]}`
          }).then(res => {
            if (res.code === 200) {
              this.$alert("发送成功,等待收件人处理");
            }
          });
        }
      }).catch(error => {
        // 如果 addKey 或 addSn 失败,执行这里的代码
        this.$message.error("提交过程中发生错误: " + error);
        // 可以选择在这里重置 address 或保持它,取决于你的需求
      });
      this.dialogFormVisible = false;
    },

这样一来,就可以实现在表单提交时,邮箱对话框弹出,同时监听邮箱发送按钮的点击事件。

这里有一个问题,要获取到历史填写的邮箱,需要保证历史填写的邮箱持久化,其实可以直接获取所有用户的邮箱渲染到下拉框上,但是不符合权限管理,因为项目经理不应该看到其他用户。

所以,干脆创建了一个张申请人表,sdmc_applicant

内容也很简单,因为只需要知道收件人姓名和邮箱即可。

 但是,输入邮箱的时候怎么持久化到数据库中呢,一般输入邮箱不会携带收件人的姓名,

所以,在分配账号的时候,如果角色包含了项目经理,则直接把用户名和邮箱直接同步一份到applicant表中,之后下拉框数据从这张表中获取即可。

@Override
    @Transactional
    public int insertUser(SysUser user)
    {
        // 新增用户信息
        int rows = userMapper.insertUser(user);
        // 新增用户岗位关联
        insertUserPost(user);
        // 新增用户与角色管理
        insertUserRole(user);
        // 如果用户角色是项目经理,则插入数据到applicant表中
        // 取所有角色,判断是否包含项目经理角色
        Long[] roleIds = user.getRoleIds();
        List<String> roleNames = Arrays.stream(roleIds).map(roleId -> roleMapper.selectRoleById(roleId).getRoleName()).collect(Collectors.toList());
        if (roleNames.contains(PROJECT_MANAGER)){
            applicantMapper.insertApplicant(user.getUserName(),user.getEmail());
        }
        return rows;
    }

效果展示

这样,收件人的信息就一目了然了。

又发现了一个问题,这里邮箱下拉框只会获取到项目经理的,但是项目经理登陆的话应该是看到操作员的邮箱。

所以,applicant表还需要再加个角色字段

创建账户的时候也区分角色

 @Override
    @Transactional
    public int insertUser(SysUser user)
    {
        // 新增用户信息
        int rows = userMapper.insertUser(user);
        // 新增用户岗位关联
        insertUserPost(user);
        // 新增用户与角色管理
        insertUserRole(user);
        // 如果用户角色是项目经理,则插入数据到applicant表中
        // 取所有角色,判断是否包含项目经理角色
        Long[] roleIds = user.getRoleIds();
        List<String> roleNames = Arrays.stream(roleIds).map(roleId -> roleMapper.selectRoleById(roleId).getRoleName()).collect(Collectors.toList());
        if (roleNames.contains(PROJECT_MANAGER)){
            applicantMapper.insertApplicant(PROJECT_MANAGER,user.getUserName(),user.getEmail());
        }
        // 判断是否包含操作员
        if (roleNames.contains(OPERATOR)){
            applicantMapper.insertApplicant(OPERATOR,user.getUserName(),user.getEmail());
        }
        return rows;
    }

获取邮箱数据前也要先判断当前用户的角色

@Override
    public List<SdmcApplicant> selectSdmcApplicantList() {
        List<SdmcApplicant> applicants = applicantMapper.selectSdmcApplicantList();
        // 判断当前登录用户是项目经理还是操作员
        // 获取当前用户编号
        Long userId = SecurityUtils.getUserId();
        List<Long> roleIds = userRoleMapper.selectRoleIdsByUserId(userId);
        List<String> roleNames = roleIds.stream().map(roleId -> roleService.selectRoleById(roleId).getRoleName()).collect(Collectors.toList());
        if (roleNames.contains(PROJECT_MANAGER)){
            // 获取所有操作员的邮箱
            return applicantMapper.selectByRoleKey(OPERATOR);
        }
        if (roleNames.contains(OPERATOR)){
            // 获取所有操作员的邮箱
            return applicantMapper.selectByRoleKey(PROJECT_MANAGER);
        }
        return applicantMapper.selectSdmcApplicantList();
    }

完事儿。

  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值