Przeglądaj źródła

1.添加新增角色功能

1 1 miesiąc temu
rodzic
commit
105f982169

+ 5 - 0
imwork-windows/imwork-silos/src/main/java/top/imwork/window/silos/controller/upms/RoleViewController.java

@@ -21,4 +21,9 @@ public class RoleViewController {
     public String list() {
         return "/upms/role/list";
     }
+
+    @GetMapping("/edit.html")
+    public String edit() {
+        return "/upms/role/edit";
+    }
 }

+ 9 - 0
imwork-windows/imwork-silos/src/main/java/top/imwork/window/silos/service/impl/SysRoleServiceImpl.java

@@ -2,6 +2,7 @@ package top.imwork.window.silos.service.impl;
 
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.stereotype.Service;
 import org.springframework.util.ObjectUtils;
 import jakarta.annotation.Resource;
@@ -19,6 +20,7 @@ import top.imwork.window.silos.pojo.dto.SysRoleListDTO;
 import top.imwork.window.silos.service.ISysRoleService;
 import top.imwork.window.silos.convert.SysRoleConvert;
 
+import java.util.Date;
 import java.util.List;
 
 @Service("sysRoleService")
@@ -48,8 +50,15 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleDao, SysRole> impleme
     public SysRoleBO save(SysRoleDTO sysRoleDTO) {
         SysRole sysRole = SysRoleConvert.sysRoleDtoToDo(sysRoleDTO);
         if (ObjectUtils.isEmpty(sysRole.getId())) {
+            sysRole.setDelFlag("N");
+            sysRole.setCreator("admin");
+            sysRole.setCreateTime(new Date());
+            sysRole.setUpdateTime(new Date());
+            sysRole.setModifier("admin");
+
             sysRoleDao.insert(sysRole);
         } else {
+            sysRole.setUpdateTime(new Date());
             sysRoleDao.updateById(sysRole);
         }
         return SysRoleConvert.sysRoleDoToBo(sysRole);

+ 306 - 0
imwork-windows/imwork-silos/src/main/resources/static/business/upms/role/css/edit.css

@@ -0,0 +1,306 @@
+:root {
+    --primary: #4361ee;
+    --secondary: #3f37c9;
+    --success: #4cc9f0;
+    --warning: #f72585;
+    --light: #f8f9fa;
+    --dark: #212529;
+    --gray: #6c757d;
+    --light-gray: #e9ecef;
+    --border-radius: 8px;
+    --box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
+    --transition: all 0.3s ease;
+}
+
+* {
+    margin: 0;
+    padding: 0;
+    box-sizing: border-box;
+    font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+}
+
+body {
+    background-color: #f5f7fb;
+    color: var(--dark);
+    line-height: 1.6;
+}
+
+.container {
+    max-width: 1000px;
+    margin: 0 auto;
+    padding: 20px;
+}
+
+header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin-bottom: 30px;
+    padding-bottom: 15px;
+    border-bottom: 1px solid var(--light-gray);
+}
+
+.header-title h1 {
+    font-size: 28px;
+    color: var(--primary);
+    display: flex;
+    align-items: center;
+    gap: 10px;
+}
+
+.header-title p {
+    color: var(--gray);
+    font-size: 14px;
+}
+
+.user-info {
+    display: flex;
+    align-items: center;
+    gap: 15px;
+}
+
+.user-avatar {
+    width: 40px;
+    height: 40px;
+    border-radius: 50%;
+    background-color: var(--primary);
+    color: white;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    font-weight: bold;
+}
+
+.form-container {
+    background: white;
+    border-radius: var(--border-radius);
+    box-shadow: var(--box-shadow);
+    overflow: hidden;
+    margin-bottom: 30px;
+}
+
+.form-header {
+    padding: 20px;
+    background: linear-gradient(135deg, #4361ee, #3a0ca3);
+    color: white;
+}
+
+.form-title {
+    font-size: 20px;
+    font-weight: 600;
+    display: flex;
+    align-items: center;
+    gap: 10px;
+}
+
+.form-body {
+    padding: 30px;
+}
+
+.form-section {
+    margin-bottom: 30px;
+}
+
+.section-title {
+    font-size: 18px;
+    font-weight: 600;
+    margin-bottom: 20px;
+    padding-bottom: 10px;
+    border-bottom: 1px solid var(--light-gray);
+    color: var(--primary);
+    display: flex;
+    align-items: center;
+    gap: 10px;
+}
+
+.form-row {
+    display: grid;
+    grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
+    gap: 20px;
+    margin-bottom: 20px;
+}
+
+.form-group {
+    margin-bottom: 15px;
+}
+
+.form-group label {
+    display: block;
+    margin-bottom: 8px;
+    font-size: 14px;
+    font-weight: 500;
+}
+
+.required::after {
+    content: " *";
+    color: #dc3545;
+}
+
+.form-control {
+    width: 100%;
+    padding: 12px 15px;
+    border: 1px solid var(--light-gray);
+    border-radius: var(--border-radius);
+    font-size: 14px;
+    transition: var(--transition);
+}
+
+.form-control:focus {
+    outline: none;
+    border-color: var(--primary);
+    box-shadow: 0 0 0 3px rgba(67, 97, 238, 0.2);
+}
+
+.form-control.error {
+    border-color: #dc3545;
+}
+
+.form-text {
+    font-size: 12px;
+    color: var(--gray);
+    margin-top: 5px;
+}
+
+.form-error {
+    font-size: 12px;
+    color: #dc3545;
+    margin-top: 5px;
+    display: none;
+}
+
+.btn {
+    padding: 12px 24px;
+    border: none;
+    border-radius: var(--border-radius);
+    cursor: pointer;
+    font-size: 14px;
+    font-weight: 500;
+    transition: var(--transition);
+    display: inline-flex;
+    align-items: center;
+    gap: 8px;
+}
+
+.btn-primary {
+    background-color: var(--primary);
+    color: white;
+}
+
+.btn-primary:hover {
+    background-color: var(--secondary);
+}
+
+.btn-success {
+    background-color: #28a745;
+    color: white;
+}
+
+.btn-success:hover {
+    background-color: #218838;
+}
+
+.btn-light {
+    background-color: var(--light-gray);
+    color: var(--dark);
+}
+
+.btn-light:hover {
+    background-color: #dae0e5;
+}
+
+.form-footer {
+    padding: 20px;
+    border-top: 1px solid var(--light-gray);
+    display: flex;
+    justify-content: flex-end;
+    gap: 15px;
+}
+
+.permission-section {
+    margin-top: 30px;
+    border-top: 1px solid var(--light-gray);
+    padding-top: 20px;
+}
+
+.permission-category {
+    margin-bottom: 25px;
+}
+
+.category-title {
+    font-size: 16px;
+    font-weight: 600;
+    margin-bottom: 15px;
+    color: var(--dark);
+    display: flex;
+    align-items: center;
+    gap: 8px;
+}
+
+.permission-grid {
+    display: grid;
+    grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
+    gap: 12px;
+    margin-bottom: 20px;
+}
+
+.permission-item {
+    display: flex;
+    align-items: center;
+    gap: 10px;
+    padding: 10px;
+    border: 1px solid var(--light-gray);
+    border-radius: var(--border-radius);
+    transition: var(--transition);
+}
+
+.permission-item:hover {
+    background-color: #f8f9fa;
+    border-color: var(--primary);
+}
+
+.permission-item input[type="checkbox"] {
+    width: 18px;
+    height: 18px;
+    cursor: pointer;
+}
+
+.permission-item label {
+    cursor: pointer;
+    font-size: 14px;
+    margin-bottom: 0;
+}
+
+.select-all {
+    display: flex;
+    align-items: center;
+    gap: 8px;
+    margin-bottom: 15px;
+    padding: 8px 12px;
+    background-color: #f8f9fa;
+    border-radius: var(--border-radius);
+}
+
+.select-all input[type="checkbox"] {
+    width: 18px;
+    height: 18px;
+}
+
+.select-all label {
+    font-weight: 500;
+    margin-bottom: 0;
+    cursor: pointer;
+}
+
+@media (max-width: 768px) {
+    .form-row {
+        grid-template-columns: 1fr;
+    }
+
+    .permission-grid {
+        grid-template-columns: 1fr;
+    }
+
+    .form-footer {
+        flex-direction: column;
+    }
+}

+ 44 - 0
imwork-windows/imwork-silos/src/main/resources/static/business/upms/role/js/edit.js

@@ -0,0 +1,44 @@
+layui.use(['form', 'layer'], function () {
+    var form = layui.form
+    layer = parent.layer === undefined ? layui.layer : top.layer,
+        $ = layui.jquery;
+
+    form.on("submit(save)", function (data) {
+        //弹出loading
+        const index = top.layer.msg('数据提交中,请稍候', {icon: 16, time: false, shade: 0.8});
+        //实际使用时的提交信息
+        $.ajax( {
+            url : "/upms/sysrole/save",
+            type : "POST",
+            dataType:"json",
+            contentType:'application/json;charset=UTF-8',
+            data:JSON.stringify({roleName:$("#roleName").val(),
+                parentId:$("#parentId").val(),
+                roleType: $("#roleType").val(),
+                roleLevel: $("#roleLevel").val(),
+                roleDesc: $("#roleDesc").val(),
+                isSys: $("#isSys").val(),
+                enabled: $("#enabled").val(),
+                sort: $("#sort").val(),
+                status: $("#status").val(),
+                remark: $("#remark").val(),
+            }),
+            success : function(res) {
+                console.log(res);
+                layer.close(index);
+                layer.msg(res.msg);
+                layer.closeAll("iframe");
+                //刷新父页面
+                parent.location.reload();
+            },
+            error:function(e){
+                layer.close(index);
+                layer.msg("信息提交异常!");
+                layer.closeAll("iframe");
+                //刷新父页面
+                parent.location.reload();
+            }
+        })
+        return false;
+    })
+})

+ 2 - 2
imwork-windows/imwork-silos/src/main/resources/static/business/upms/role/js/list.js

@@ -96,7 +96,7 @@ layui.use(['form', 'layer', 'table', 'laytpl', 'jquery'], function () {
 
         // 添加角色
         $addBtn.click(function () {
-            openDialog("添加角色", "/upms/sysrole/update");
+            openDialog("添加角色", "/upms/role/edit.html");
         });
 
         // 批量删除
@@ -229,7 +229,7 @@ layui.use(['form', 'layer', 'table', 'laytpl', 'jquery'], function () {
             title: title,
             type: 2,
             content: url,
-            area: ['95%', '95%'],
+            area: ['100%', '100%'],
             maxmin: true,
             success: function (layero, index) {
                 // 如果有数据,传递给子窗口

+ 168 - 0
imwork-windows/imwork-silos/src/main/resources/templates/upms/role/edit.html

@@ -0,0 +1,168 @@
+<!DOCTYPE html>
+<html lang="zh-CN" xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta charset="UTF-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,Chrome=1">
+    <!-- Google Chrome Frame也可以让IE用上Chrome的引擎: -->
+    <meta name="renderer" content="webkit">
+    <!--国产浏览器高速模式-->
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <!-- 作者 -->
+    <meta name="author" content="silos"/>
+    <meta name="revised" content="Silos-Admin-v-2.0.0"/>
+    <!-- 定义页面的最新版本 -->
+    <meta name="description" content="网站简介"/>
+    <!-- 网站简介 -->
+    <meta name="keywords" content="搜索关键字,以半角英文逗号隔开"/>
+    <title>Index</title>
+    <!-- 公共样式 开始 -->
+    <link rel="shortcut icon" href="../../../static/assets/silos/img/favicon.png"
+          th:href="@{/assets/silos/img/favicon.png}"/>
+    <link rel="bookmark" href="../../../static/assets/silos/img/favicon.png"
+          th:href="@{/assets/silos/img/favicon.png}"/>
+    <link rel="stylesheet" href="../../../static/assets/lib/layui/css/layui.css"
+          th:href="@{/assets/lib/layui/css/layui.css}"/>
+    <link rel="stylesheet" href="../../../static/assets/lib/fonts/fontawesome6/css/all.css"
+          th:href="@{/assets/lib/fonts/fontawesome6/css/all.css}"/>
+    <link rel="stylesheet" href="../../../static/business/upms/role/css/edit.css" th:href="@{/business/upms/role/css/edit.css}"/>
+</head>
+<body>
+<div class="container">
+    <div class="form-container">
+        <div class="form-header">
+            <div class="form-title">
+                <i class="fas fa-user-plus"></i> 添加角色
+            </div>
+        </div>
+        <div class="form-body">
+            <form id="role-form">
+                <!-- 基本信息部分 -->
+                <div class="form-section">
+                    <div class="section-title">
+                        <i class="fas fa-id-card"></i> 基本信息
+                    </div>
+
+                    <div class="form-row">
+                        <div class="form-group">
+                            <label for="roleName" class="required">角色名称</label>
+                            <input type="text" id="roleName" class="form-control" placeholder="输入角色名称" required>
+                            <div class="form-error" id="role-name-error">角色名称不能为空</div>
+                        </div>
+                        <div class="form-group">
+                            <label for="parentId">父级角色</label>
+                            <select id="parentId" class="form-control">
+                                <option value="">无父级角色</option>
+                                <option value="1">超级管理员</option>
+                                <option value="2">系统管理员</option>
+                                <option value="3">平台管理员</option>
+                                <option value="4">区域管理员</option>
+                            </select>
+                            <div class="form-text">选择上级角色,建立角色层级关系</div>
+                        </div>
+                    </div>
+
+                    <div class="form-row">
+                        <div class="form-group">
+                            <label for="roleType" class="required">角色类型</label>
+                            <select id="roleType" class="form-control" required>
+                                <option value="0">普通角色</option>
+                                <option value="1">普通管理员</option>
+                                <option value="2">区域管理员</option>
+                                <option value="3">平台管理员</option>
+                                <option value="5">系统管理员</option>
+                                <option value="9">超级管理员</option>
+                            </select>
+                            <div class="form-text">角色类型决定权限范围和系统访问级别</div>
+                        </div>
+                        <div class="form-group">
+                            <label for="roleLevel">角色级别</label>
+                            <input type="number" id="roleLevel" class="form-control" placeholder="输入角色级别" min="1" max="10">
+                            <div class="form-text">数字越小级别越高,1为最高级别</div>
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label for="roleDesc">角色描述</label>
+                        <textarea id="roleDesc" class="form-control" rows="3" placeholder="输入角色描述"></textarea>
+                        <div class="form-text">简要描述角色的职责和权限范围</div>
+                    </div>
+                </div>
+
+                <!-- 状态设置部分 -->
+                <div class="form-section">
+                    <div class="section-title">
+                        <i class="fas fa-cog"></i> 状态设置
+                    </div>
+
+                    <div class="form-row">
+                        <div class="form-group">
+                            <label for="isSys">是否系统数据</label>
+                            <select id="isSys" class="form-control">
+                                <option value="0">否</option>
+                                <option value="1">是</option>
+                            </select>
+                            <div class="form-text">系统数据通常为系统内置角色,不可删除</div>
+                        </div>
+                        <div class="form-group">
+                            <label for="enabled">启用状态</label>
+                            <select id="enabled" class="form-control">
+                                <option value="1">启用</option>
+                                <option value="0">禁用</option>
+                            </select>
+                            <div class="form-text">禁用状态下角色将无法使用</div>
+                        </div>
+                    </div>
+
+                    <div class="form-row">
+                        <div class="form-group">
+                            <label for="sort">排序</label>
+                            <input type="number" id="sort" class="form-control" placeholder="输入排序值" value="0">
+                            <div class="form-text">数字越小排序越靠前</div>
+                        </div>
+                        <div class="form-group">
+                            <label for="status">状态字符类型</label>
+                            <select id="status" class="form-control">
+                                <option value="0">正常</option>
+                                <option value="1">删除</option>
+                                <option value="2">受限操作</option>
+                            </select>
+                            <div class="form-text">系统层级状态字符类型</div>
+                        </div>
+                    </div>
+                </div>
+
+                <!-- 其他信息部分 -->
+                <div class="form-section">
+                    <div class="section-title">
+                        <i class="fas fa-info-circle"></i> 其他信息
+                    </div>
+
+                    <div class="form-group">
+                        <label for="remark">备注</label>
+                        <textarea id="remark" class="form-control" rows="2" placeholder="输入备注信息"></textarea>
+                    </div>
+                </div>
+
+                <div class="layui-form-item layui-row layui-col-xs12">
+                    <div class="layui-input-block">
+                        <button class="layui-btn layui-btn-sm" lay-submit="" lay-filter="save">保存</button>
+                        <button type="reset" class="layui-btn layui-btn-sm layui-btn-primary">清除</button>
+                    </div>
+                </div>
+            </form>
+        </div>
+        <!--<div class="form-footer">
+            <button type="button" class="btn btn-light" id="cancel-btn">
+                <i class="fas fa-times"></i> 取消
+            </button>
+            <button type="button" class="btn btn-primary" id="save-btn">
+                <i class="fas fa-save"></i> 保存角色
+            </button>
+        </div>-->
+    </div>
+</div>
+<script src="../../../static/assets/lib/jquery/jquery.js" th:src="@{/assets/lib/jquery/jquery.js}"></script>
+<script src="../../../static/assets/lib/layui/layui.js" th:src="@{/assets/lib/layui/layui.js}"></script>
+<script src="../../../static/business/upms/role/js/edit.js" th:src="@{/business/upms/role/js/edit.js}"></script>
+</body>
+</html>