feat(login): 更换登录验证码为图形字符验证码

- 配置文件 website.js 中将 captchaType 从 'behavior' 改为 'image'
- 修改 userlogin.vue,图形验证码图片由输入框内联改为输入框旁独立显示
- 重写 login.scss 样式,实现验证码图片区域带边框和高亮效果
- 确保验证码图片点击可刷新,且支持从后端接口获取数据
- 登录页仍默认显示 IAM 登录,需切换「账号密码登录」显示验证码区域

feat(contract-manage): 优化所属组织搜索栏为树形下拉选择框

- 引入并应用 organization-search mixin 统一管理所属组织搜索
- contract-manage.js、driver.js、transport-ship.js、transport-vehicle.js 中所属组织搜索改为 searchslot 模式
- contract-manage.vue 中新增 renderOrganizationSearch 方法,渲染基于 ElTreeSelect 的树形下拉组件
- 组织树数据加载时自动排除「外部组织」节点,保持搜索选项清晰
- 所有相关所属组织搜索统一样式与交互,提升用户体验

feat(system): 用户和部门视图样式及操作改进

- user.vue 和 userinfo.vue 中 el-tabs 组件添加 border-card 类型,提升标签页视觉效果
- dept.vue 中添加查看、编辑、删除操作入口,绑定对应方法,通过权限控制显示权限按钮
- dept.vue 菜单宽度、对话框宽度及行为配置优化

style(login): 调整登录样式及验证码布局细节

- 调整 .login-code-wrap 及内部元素的 flex 布局,输入框与验证码图片并排显示
- 设置验证码图片容器尺寸、边框及 hover 高亮样式
- 确保验证码图片撑满容器并禁止用户选中

refactor(mixins): 新增 organization-search 统一搜索 mixin

- 实现组织树数据加载、排除外部节点、归一化及扁平化处理
- 提供 renderOrganizationSearch 方法用于渲染统一树形选择搜索框
- 减少重复代码,方便各页面快速接入和统一维护

chore(vehicle): 车辆页面引入 organization-search mixin

- 在车辆视图 vehicle.vue 中混入 organization-search,增强所属组织搜索功能一致性
This commit is contained in:
2026-08-28 15:41:01 +08:00
parent 99d6284a58
commit f7eea88945
14 changed files with 231 additions and 56 deletions
+26 -15
View File
@@ -134,26 +134,37 @@
}
.login-code {
width: 100%;
height: 100%;
.el-input-group__append {
background-color: #fff;
}
.login-code-wrap {
display: flex;
align-items: stretch;
width: 100%;
gap: 10px;
.el-input {
flex: 1;
}
}
.login-code-box {
width: 130px;
height: 38px;
flex: none;
border: 1px solid #dcdfe6;
border-radius: 4px;
overflow: hidden;
cursor: pointer;
background: #fff;
display: flex;
align-items: center;
justify-content: center;
transition: border-color 0.2s;
&:hover {
border-color: #409eff;
}
}
.login-code-img {
cursor: pointer;
min-width: 100px;
padding: 0 5px;
height: 30px;
color: #333;
font-size: 20px;
font-weight: bold;
letter-spacing: 3px;
line-height: 38px;
text-indent: 5px;
text-align: center;
box-sizing: border-box;
width: 100%;
height: 100%;
object-fit: fill;
display: block;
user-select: none;
}