上周总结需要解决的问题:
sn加上结束地址文件上传和下载不采用服务器,改成本地操作项目经理申请订单时,要能同时上传多个类型的key项目经理只能看到自己的项目订单页展示各类型key名称,支持下载给订单生成MD5码邮箱点击下拉,弹出历史选项
问题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();
}
完事儿。