day22_用户模块

day22_用户模块

1查询

image-20250822093250732

sql分析

-- 定制系统
-- 查询分段记录
select au1.*,au2.username create_uname from admin_user au1 left join admin_user au2 on au1.create_uid = au2.uid

where au1.username like CONCAT('%','a','%')
AND   au1.isvalid = 0

limit 0,3

-- 统计总记录数
select count(1) from admin_user au1

where au1.username like CONCAT('%','a','%')
AND   au1.isvalid = 0

dao代码


    <select id="listUserByCondition" resultMap="AdminUserMap">

        select au1.*,au2.username create_uname from admin_user au1 left join admin_user au2 on au1.create_uid = au2.uid
        <where>
            <if test="inputUser.username !=null and inputUser.username != ''">
                au1.username like CONCAT('%',#{inputUser.username},'%')
            </if>
            <if test="inputUser.isvalid !=null">
                AND   au1.isvalid = #{inputUser.isvalid}
            </if>

        </where>
        limit #{startIdx},#{pageSize}


    </select>

    <select id="countUserByCondition" resultType="java.lang.Integer">
        select count(1) from admin_user au1
        <where>
            <if test="inputUser.username !=null and inputUser.username != ''">
                au1.username like CONCAT('%',#{inputUser.username},'%')
            </if>
            <if test="inputUser.isvalid !=null">
                AND   au1.isvalid = #{inputUser.isvalid}
            </if>

        </where>


    </select>

查询接口

    protected void listUser(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String isvalidStr = req.getParameter("isvalid");
        String pageStr = req.getParameter("page");
        String pageSizeStr = req.getParameter("pageSize");
        Integer isvalid = null;
        if(isvalidStr!=null&&!"".equals(isvalidStr)){
            isvalid = Integer.valueOf(isvalidStr);
        }
        AdminUser inputUser = new AdminUser(username, isvalid);

        Integer page = 1;
        Integer pageSize = 3;
        if(pageStr!=null&&!"".equals(pageStr)){
            page = Integer.valueOf(pageStr);
        }
        if(pageSizeStr!=null&&!"".equals(pageSizeStr)){
            pageSize = Integer.valueOf(pageSizeStr);
        }

        //调用service
        AdminUserService adminUserService = new AdminUserServiceImpl();
        //1查总记录数
        Integer total = adminUserService.countUserByCondition(inputUser);
        Integer totalPage = PageInfo.getTotalPage(total, pageSize);
        //2控制超页
        if(page>totalPage&&page!=1){
            page = totalPage;
        }
        //3查询分段记录
        List<AdminUser> adminUsers = adminUserService.listUserByCondition(inputUser, page, pageSize);

        //反馈数据
        Result result = null;
        if(adminUsers.size()>0){
            PageInfo pageInfo = new PageInfo(page,pageSize,total);
            result =  new Result(ReturnCode.QUERY_SUCCESS.getCode(),
                                ReturnCode.QUERY_SUCCESS.getMsg(),
                                adminUsers,pageInfo);
        }else{
            result =  new Result(ReturnCode.QUERY_NODATA.getCode(),
                                 ReturnCode.QUERY_NODATA.getMsg());
        }

        resp.setContentType("application/json;charset=utf-8");
        PrintWriter writer = resp.getWriter();
        writer.print(JSON.toJSONString(result));
        writer.close();


    }

查询界面

<template>

<el-form ref="queryFormRef" :model="queryForm" :inline="true">
        <el-form-item label="用户名称" prop="username">
            <el-input v-model="queryForm.username" style="width: 240px;" placeholder="username" clearable />
        </el-form-item>
        <el-form-item label="用户状态" prop="isvalid">
            <el-select v-model="queryForm.isvalid" placeholder="请选择" style="width: 240px;" clearable>
                <el-option label="离职" :value="0" />
                <el-option label="在职" :value="1" />
                <el-option label="休假" :value="2" />
            </el-select>
        </el-form-item>
        <el-form-item>
            <el-button type="primary" @click="querySubmit">查询</el-button>
            <el-button @click="queryReset">重置</el-button>
        </el-form-item>
    </el-form>

     <el-table height="450" :data="tableData.tableList" style="width: 100%">
        <el-table-column prop="uid" fixed  label="编号" width="180" />
        <el-table-column prop="username" label="用户名" width="180" />
        <el-table-column prop="password" label="密码" width="180">
            <template #default="scope">
                <el-text type="info">{{ transPassword(scope.row.password) }} </el-text>
                
            </template>

        </el-table-column>
        <el-table-column prop="isvalid" label="用户状态" width="180">
            <template #default="scope">
                <el-text v-if="scope.row.isvalid == 1"  type="success">在职</el-text>
                <el-text v-else-if="scope.row.isvalid == 0" type="danger">离职</el-text>
                <el-text v-else-if="scope.row.isvalid == 2" type="warning">休假</el-text>
                
            </template>

        </el-table-column>
        <el-table-column prop="createUid" label="创建人" width="180"/>
        <el-table-column prop="createUname" label="创建名称" width="180"/>
        <el-table-column prop="regTime" label="注册时间" width="180">
            <template #default="scope">
                <el-tag type="primary">{{scope.row.regTime}}</el-tag>
                
            </template>
            
        </el-table-column>
        <el-table-column prop="loginTime" label="最后登录时间" width="180">
            <template #default="scope">
                <el-tag type="primary">{{scope.row.loginTime}}</el-tag>
                
            </template>
            
        </el-table-column>
        <el-table-column prop="headImg" label="头像地址" width="180">
            <template #default="scope">
                <img :src="scope.row.headImg"></img>

            </template>
        </el-table-column>
    </el-table>

    <el-pagination
      v-model:current-page="tableData.pageInfo.page"
      v-model:page-size="tableData.pageInfo.pageSize"
      :total="tableData.pageInfo.total"
      :page-sizes="[3, 6, 9]"
      layout="total, sizes, prev, pager, next, jumper"
      
      @size-change="handleSizeChange"
      @current-change="handleCurrentChange"
    />


</template>

<script setup>
import { ref,reactive,onMounted } from 'vue'
import {Check,Delete,Edit,Message,Search,Star,Share} from '@element-plus/icons-vue'
import { myGet, myPost } from '@/myaxios'
import { ElMessage, ElMessageBox } from 'element-plus'

/**查询功能 */
//table绑定的数据
const tableData = reactive({tableList:[],
                            pageInfo:{
                                page:1,
                                pageSize:3,
                                total:55
                            }
})
//查询表单对象
const queryFormRef = ref()

//查询表单
const queryForm = reactive({
    username:'',
    isvalid:''
})
//查询按钮
const querySubmit = ()=>{
    myQuery(queryForm)
}
//重置按钮
const queryReset = ()=>{
    //清数据
    queryFormRef.value.resetFields()
    //重新查
    myQuery({})
}


//page改变
const handleCurrentChange = (page)=>{
    //改页码参数
    tableData.pageInfo.page = page
    let params1 = tableData.pageInfo
    let params2 = queryForm
    //查询请求
    myQuery({...params1,...params2})
}
//pageSize改变
const handleSizeChange = (pageSize)=>{
    //改页码参数
    tableData.pageInfo.page = 1
    tableData.pageInfo.pageSize = pageSize
    let params1 = tableData.pageInfo
    let params2 = queryForm
    //查询请求
    myQuery({...params1,...params2})
}


/**公共函数 */
//密码脱敏(把密码字段通过程序逻辑做部分隐藏)
const transPassword = (pwd)=>{
    let pwdStart = pwd.substr(0,1)
    let pwdEnd = pwd.substr(pwd.length-1,1)
    return `${pwdStart}***${pwdEnd}`;
}


//查询函数
const myQuery = async (params)=>{
/**
 * await  异步同步等待
 * async  异步同步控制
 * 回调地狱 .then互相嵌套调用 代码结构显得杂乱
 * 
 * 语法糖 简化和优化语法的语法功能
 *        使用了await语法之后 ajax请求代码结构更简洁
 */
    //await 主线程会等待 await的函数 执行完 主线程才会继续执行
    let resp = await myGet("/users/listUser",params)
    if(resp.data.code == 20000){
        tableData.tableList = resp.data.returnData
        tableData.pageInfo  = resp.data.pageInfo
    }else if(resp.data.code == 20001){
        tableData.tableList = []
        tableData.pageInfo  = {page:1,pageSize:3,total:0}
    }

}

/**页面加载结束 加载查询数据 */
onMounted(()=>{
    myQuery({})
})


</script>

<style scoped>
    img{
        width: 50px;
        height: 50px;
    }
</style>

2添加

sql分析

-- 添加语句                                                                                 
insert into admin_user (username,`password`,reg_time,isvalid,create_uid,head_img) VALUES ('test1','abc123',NOW(),1,7,'/test1')
--                         界面     默认      系统函数    默认   session后端取 界面

dao

    <insert id="insertAdminUser">
        insert into admin_user
            (username,`password`,reg_time,isvalid,create_uid,head_img)
        VALUES
            (#{username},'abc123',NOW(),1,#{createUid},#{headImg})


    </insert>

插入接口

    protected void insertUser(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String headImg = req.getParameter("headImg");

        //把当前登录的用户编号 存入createUid
        AdminUser loginUser =(AdminUser) req.getSession().getAttribute("loginUser");
        //createUid是创建人编号
        AdminUser inputUser = new AdminUser(loginUser.getUid(), username, headImg);
        //调用service
        AdminUserService adminUserService = new AdminUserServiceImpl();
        Integer resNum = adminUserService.insertAdminUser(inputUser);
        Result result = null;
        if(resNum>0){
            result = new Result(ReturnCode.OPERATION_DATA_SUCCESS.getCode(), ReturnCode.OPERATION_DATA_SUCCESS.getMsg());
        }else{
            result = new Result(ReturnCode.OPERATION_DATA_FAILED.getCode(), ReturnCode.OPERATION_DATA_FAILED.getMsg());

        }

        resp.setContentType("application/json;charset=utf-8");
        PrintWriter writer = resp.getWriter();
        writer.print(JSON.toJSONString(result));
        writer.close();


    }

添加界面

  <el-drawer title="添加" size="30%" v-model="drawerVisable" direction="rtl">
    <el-form ref="insertFromRef"  :model="insertForm" label-width="70"
            style="max-width: 600px">
            <el-form-item label="用户名称" prop="username">
                <el-input v-model="insertForm.username" />
            </el-form-item>
            <el-form-item label="头像地址" prop="headImg">
                <el-input v-model="insertForm.headImg" />
            </el-form-item>
            <el-form-item>
                <el-button type="primary" @click="insertSubmit">保存</el-button>
            </el-form-item>

        </el-form>

    <!-- <template #footer>
      <div style="flex: auto">
        <el-button @click="cancelClick">cancel</el-button>
        <el-button type="primary" @click="confirmClick">confirm</el-button>
      </div>
    </template> -->
  </el-drawer>
/**添加功能 */
//抽屉显示 隐藏 bol值
const drawerVisable = ref(false)
//添加表单对象
const insertForm = reactive({
    username:'',
    headImg:''
})

//添加表单对象
const insertFromRef = ref()

//添加提交
const insertSubmit = async ()=>{
    let resp =  await myPost('/users/insertUser',insertForm);
    if(resp.data.code==20010){
        drawerVisable.value = false
        ElMessage.success(resp.data.msg)
        //当前查询条件
        let params1 = tableData.pageInfo
        let params2 = queryForm
        //查询请求
        myQuery({...params1,...params2})
        //清空表单
        insertFromRef.value.resetFields()

    }else{
        ElMessage.error(resp.data.msg)
    }


}

//抽屉开框
const openInsert = ()=>{
    drawerVisable.value = true
}

3修改

这次修改直接从页面table取值 (简化做法) 减少了从后端取修改数据的接口

sql分析

update admin_user set  username = '测试用户',`password` = 'bbcccb',reg_time = '2011-11-11 11:11:11',isvalid =0,head_img ='/测试'
       where  uid = 5562

dao

    <update id="updateAdminUser">

        update admin_user set
                username =  #{username},`password` = #{password},reg_time = #{regTime},
                isvalid =   #{isvalid}, head_img = #{headImg}
        where  uid = #{uid}


    </update>

修改接口

    protected void updateUser(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String regTime = req.getParameter("regTime");
        String isvalidStr = req.getParameter("isvalid");
        String headImg = req.getParameter("headImg");
        String uidStr = req.getParameter("uid");

        Integer isvalid = null;
        Long uid = null;
        if(isvalidStr!=null&&!"".equals(isvalidStr)){
            isvalid =  Integer.valueOf(isvalidStr);
        }
        if(uidStr!=null&&!"".equals(uidStr)){
            uid =  Long.valueOf(uidStr);
        }

        AdminUser inputUser = new AdminUser(uid, username, password, regTime, isvalid, headImg);

        //调用service
        AdminUserService adminUserService = new AdminUserServiceImpl();
        Integer resNum = adminUserService.updateAdminUser(inputUser);
        Result result = null;
        if(resNum>0){
            result = new Result(ReturnCode.OPERATION_DATA_SUCCESS.getCode(), ReturnCode.OPERATION_DATA_SUCCESS.getMsg());
        }else{
            result = new Result(ReturnCode.OPERATION_DATA_FAILED.getCode(), ReturnCode.OPERATION_DATA_FAILED.getMsg());

        }

        resp.setContentType("application/json;charset=utf-8");
        PrintWriter writer = resp.getWriter();
        writer.print(JSON.toJSONString(result));
        writer.close();


    }

修改界面

<!-- table加一列 -->
        <el-table-column fixed="right" label="操作" width="180">
            <template #default="scope">
                <el-button type="primary" @click="openUpdate(scope.row)">修改</el-button>

            </template>
        </el-table-column>
<!-- 修改弹出框(抽屉) -->
  <el-drawer title="修改" size="30%" v-model="updateVisable" direction="rtl">
    <el-form  :model="editForm.editData" label-width="70"
            style="max-width: 600px">
            <el-form-item label="用户编号" >
                <el-input disabled v-model="editForm.editData.uid" />
            </el-form-item>
            <el-form-item label="用户名称">
                <el-input v-model="editForm.editData.username" />
            </el-form-item>
            <el-form-item label="用户密码">
                <el-input v-model="editForm.editData.password" />
            </el-form-item>
            <el-form-item label="注册时间">
                <!-- <el-input v-model="editForm.editData.regTime" /> -->
                <el-date-picker
                    v-model="editForm.editData.regTime"
                    type="datetime"
                    placeholder="请选择日期"
                    value-format="YYYY-MM-DD HH:mm:ss" 
                    style="width: 100%;"
                />
            </el-form-item>
            <el-form-item label="用户状态">
                <el-select v-model="editForm.editData.isvalid" placeholder="请选择" >
                    <el-option label="离职" :value="0" />
                    <el-option label="在职" :value="1" />
                    <el-option label="休假" :value="2" />
                </el-select>
            </el-form-item>
            <el-form-item label="头像地址" >
                <el-input v-model="editForm.editData.headImg" />
            </el-form-item>
            <el-form-item>
                <el-button type="primary" @click="updateSubmit">保存</el-button>
            </el-form-item>

        </el-form>

    <!-- <template #footer>
      <div style="flex: auto">
        <el-button @click="cancelClick">cancel</el-button>
        <el-button type="primary" @click="confirmClick">confirm</el-button>
      </div>
    </template> -->
  </el-drawer>

/**修改功能 */
//修改抽屉显示 隐藏
const updateVisable = ref(false)
//修改表单对象
const editForm = reactive({editData:{
    uid:'',
    username:'',
    password:'',
    regTime:'',
    isvalid:'',
    headImg:'',
}})

//打开修改框
const openUpdate = (currentRow)=>{
    updateVisable.value = true
    // console.log(currentRow);
    // console.log(JSON.parse(JSON.stringify(currentRow))  );
    //需要做对象复制 不能直接传引用
    editForm.editData = JSON.parse(JSON.stringify(currentRow))  

}
//提交修改
const updateSubmit = async ()=>{
    let resp = await myPost("/users/updateUser", editForm.editData)
    if(resp.data.code==20010){
        updateVisable.value = false
        ElMessage.success(resp.data.msg)
        //当前查询条件
        let params1 = tableData.pageInfo
        let params2 = queryForm
        //查询请求
        myQuery({...params1,...params2})
    }else{
        ElMessage.error(resp.data.msg)
    }



}


4删除

单条删除 table中 每条数据后放一个删除按钮 配合单条删除的接口

sql分析

delete  from admin_user where uid = 5557

dao

    <delete id="deleteAdminUser">
        delete  from admin_user where uid = #{uid}
    </delete>

删除接口

protected void deleteUser(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String uidStr = req.getParameter("uid");
        Long uid = null;
        if(uidStr!=null&&!"".equals(uidStr)){
            uid =  Long.valueOf(uidStr);
        }
        AdminUserService adminUserService = new AdminUserServiceImpl();
        Integer resNum = adminUserService.deleteAdminUser(uid);
        Result result = null;
        if(resNum>0){
            result = new Result(ReturnCode.OPERATION_DATA_SUCCESS.getCode(), ReturnCode.OPERATION_DATA_SUCCESS.getMsg());
        }else{
            result = new Result(ReturnCode.OPERATION_DATA_FAILED.getCode(), ReturnCode.OPERATION_DATA_FAILED.getMsg());

        }
        resp.setContentType("application/json;charset=utf-8");
        PrintWriter writer = resp.getWriter();
        writer.print(JSON.toJSONString(result));
        writer.close();


    }

删除界面

        <el-table-column fixed="right" label="操作" width="180">
            <template #default="scope">
                <el-button type="primary" @click="openUpdate(scope.row)">修改</el-button>
                <el-button type="primary" @click="openDelete(scope.row.uid)">删除</el-button>
            </template>
        </el-table-column>
/**删除功能 */
const openDelete =   (uid)=>{
     ElMessageBox.confirm(
    `确定要删除编号为[${uid}]记录么?`,
    '注意',
    {
      confirmButtonText: '确定',
      cancelButtonText: '取消',
      type: 'warning',
    }
  )
    .then(async () => {
        //发送请求
        let resp =  await myPost("/users/deleteUser",{uid:uid})
        if(resp.data.code==20010){
            ElMessage.success(resp.data.msg)
            //当前查询条件
            let params1 = tableData.pageInfo
            let params2 = queryForm
            //查询请求
            myQuery({...params1,...params2})
        }else{
            ElMessage.error(resp.data.msg)
        }     
    })
    .catch(() => {

    })
}

5用户授权

image-20250822165403337

1点击授权按钮 弹出授权框

用tree列出所有的权限菜单 去要查出完整的菜单列表

2用户勾选 提交给后端保存

sql分析

开框 加载数据

-- 查询所有的权限菜单

select am2.*,am1.* from admin_menu am1 right join admin_menu am2 on am1.pid = am2.mid

where am2.pid = 0

-- 当前用户的已有权限编号列表 通过tree组件 默认选中
-- select mid from rel_admin_user_menu where uid = 3

保存授权信息

-- 处理权限信息时的sql

-- 先删除
delete from rel_admin_user_menu where uid = 3

-- 再添加

insert into rel_admin_user_menu(uid,mid) VALUES (3,11001),(3,11002),(3,12001),(3,13001)
posted @ 2025-09-27 21:45  小胡coding  阅读(9)  评论(0)    收藏  举报