实习生进了公司不会开发?一个真实业务教会你如何分析业务!

news2024/11/24 11:07:02

一、权限业务介绍

本业务为个人试用期的时候的真实企业级业务,进行了简单的替换词和业务内容模糊,但是业务逻辑没有变化,值得学习,代码部分可能因为替换词有部分误解,发现问题请评论区提醒我。
这个业务教会了我,代码应当复用率高,操作应闭环简化,利用算法的思想,设计任务处理队列,进行批处理,一次性批处理,数据库应交互次数少,巧妙的利用LINQ语句,简化代码难度
坚持看完,一定对你有所帮助,开头业务描述可能会有点枯燥,但是一定要看完

1. 业务字段介绍

在这里插入图片描述权限数据库字段是这样的,权限种类有四种,决定一级权限的归属

权限种类: 2
一级权限: “R1”
二级权限: “String1,String2”
指的是一个人有2权限的R1中的Sstring1和2的权限

权限种类: 1
一级权限: " * "
二级权限: " * "
指的是一个人有1权限的全权限的权限

权限种类: 1
一级权限: " R1 "
二级权限: “String1,String2”
指的是一个人有1权限的全权限的权限
权限种类: 1
一级权限: " R2 "
二级权限: “String3”
指的是一个人有1权限的R1中的Sstring1和2,和R2的String3 的权限

2. 业务需求分析

2.1 保存接口

需要实现对用户的新增权限、修改(覆盖)权限、取消权限的综合性接口。
在这里插入图片描述

图示权限选择:
权限种类: 1(A)
一级权限: " R1 "
二级权限: “String3”
指的是一个人有1权限的全权限的权限
权限种类: 1(A)
一级权限: " R2 "
二级权限: “String1,String2”
指的是一个人有1权限的R1中的Sstring1和2,和R2的String3 的权限

业务问题
  1. 用户本身有权限,要考虑是不是得软删除原有的权限新增新权限进行覆盖

  2. 从单独权限到全权限(全部勾选),前端发送数据直接改成*删除原有种类下所有的所有权限,新增一条*权限。
    在这里插入图片描述

  3. 可能会出现新增、修改、删除三种操作同时出现的情况。
    在这里插入图片描述

二、权限业务解析

1. 常规解析

根据业务逻辑一步一步思考
在这里插入图片描述

2. 企业级闭环高效解析

代码复用率高,操作闭环简化,利用交并集的思想,设计任务处理队列,进行批处理,一次性批处理,数据库交互次数少,巧妙的利用LINQ语句,简化代码难度
在这里插入图片描述
在这里插入图片描述

三、代码实现

1. BLL

1.1 获取用户存储的全部非删除权限

/// <summary>
/// 获取用户存储的全部权限(不包含删除)
/// </summary>
/// <param name="RoleType">权限类型1:A权限,2:D权限,3:M权限,4: E报表权限,*->5:所有权限</param>
/// <param name="UserAccount">用户账号</param>
/// <returns></returns>
public List<UserRoleEntity> GetAllUserRole(int RoleType, string UserAccount)
{
    // 获取符合条件的权限记录
    List<UserRoleEntity>? allPower = _roleDB.AsQueryable()
        .Where(a => a.UserAccount == UserAccount&&!a.IsDelete) // 过滤条件:指定用户账号&&存在
        .WhereIF(RoleType != 5, w => w.RoleType == Convert.ToByte(RoleType)) // 过滤条件:指定权限类型,若为 5 则不过滤
        .ToList();
    return allPower;
}

1.2 删除用户权限

/// <summary>
/// 删除用户权限
/// </summary>
/// <param name="RoleType">权限类型</param>
/// <param name="UserAccount">用户账号</param>
/// <param name="RoleName">权限组名称(可选)</param>
/// <returns></returns>
public async Task<dynamic> DeleteUserRole(int RoleType, string UserAccount, string? RoleName = null)
{
    _logger.LogInformation("开始软删除角色,用户账号: {UserAccount}, 权限类型: {RoleType}, 角色名称: {RoleName}", UserAccount, RoleType, RoleName);

    if (string.IsNullOrEmpty(UserAccount))
    {
        _logger.LogWarning("用户账号不能为空。");
        return HttpMsgResult.FailureResult(msg: "用户账号不能为空。");
    }

    var query = _roleDB.AsQueryable()
                       .Where(r => r.RoleType == RoleType && r.UserAccount == UserAccount);

    if (!string.IsNullOrEmpty(RoleName))
    {
        query = query.Where(r => r.RoleName == RoleName);
    }

    var existingRoles = await query.ToListAsync();

    if (existingRoles == null || existingRoles.Count == 0)
    {
        _logger.LogWarning("未找到对应的角色,无法删除,用户账号: {UserAccount}, 权限类型: {RoleType}, 角色名称: {RoleName}", UserAccount, RoleType, RoleName);
        return HttpMsgResult.FailureResult(msg: "未找到对应的角色,无法删除。");
    }

    try
    {
        var affectedRows = _roleDB.FakeDeleteRange(existingRoles);

        if (affectedRows > 0)
        {
            _logger.LogInformation("成功软删除 {Count} 条角色记录,用户账号: {UserAccount}", affectedRows, UserAccount);
            return HttpMsgResult.SuccessResult(msg: $"用户权限已被软删除,共删除 {affectedRows} 条记录。");
        }
        else
        {
            _logger.LogWarning("未能软删除角色记录,用户账号: {UserAccount}", UserAccount);
            return HttpMsgResult.FailureResult(msg: "未能删除用户权限。");
        }
    }
    catch (Exception ex)
    {
        _logger.LogError(ex, "软删除角色时发生错误,用户账号: {UserAccount}, 权限类型: {RoleType}, 角色名称: {RoleName}", UserAccount, RoleType, RoleName);
        return HttpMsgResult.FailureResult(msg: "删除用户权限时发生错误:" + ex.Message);
    }
}

1.3 数据传输对象解析

/// <summary>
/// 将综合的用户角色数据传输对象解析为多个 UserRoleEntity 对象。
/// </summary>
/// <param name="userRoleJsonDto">用户角色数据传输对象综合列表。</param>
/// <returns>解析后的 UserRoleEntity 对象列表。</returns>
public List<UserRoleEntity> ParseJsonDtoToUserRoleDtos(UserRoleJsonDto userRoleJsonDto)
{
    List<UserRoleEntity>? userRoleDtos = new List<UserRoleEntity>();

    foreach (RoleDetailDto role in userRoleJsonDto.Roles)
    {
        UserRoleEntity? userRoleDto = new UserRoleEntity
        {
            UserAccount = userRoleJsonDto.UserAccount, // 将用户账号赋值给每个 UserRoleDto
            UserRealName = userRoleJsonDto.UserRealName, // 将用户真实姓名赋值给每个 UserRoleDto
            RoleType = (byte?)role.RoleType, // 赋值权限类型
            RoleName = role.RoleName, // 赋值角色名称
            SubRole = string.Join(",", role.SubRoles ?? Array.Empty<string>()), // 赋值子类Code数组
            IsDelete = userRoleJsonDto.IsDelete == 1 // 继承综合对象的删除状态
        };

        userRoleDtos.Add(userRoleDto);
    }

    return userRoleDtos;
}

2. Dto

2.1 userRoleJsonDto

namespace OPC.PR.Application.Objects
{
    /// <summary>
    /// 角色详细信息数据传输对象
    /// </summary>
    public class RoleDetailDto
    {
        /// <summary>
        /// 所属权限组的类型 权限类型1:A权限,2:D权限,3:M权限,4: E报表权限,*->5:所有权限</param>
        /// </summary>
        public int RoleType { get; set; }
        /// <summary>
        /// 所属权限组的名称(全部时为*)
        /// </summary>
        public string? RoleName { get; set; }

        /// <summary>
        /// 所属权限大类下得子类Code
        /// </summary>
        public string[]? SubRoles { get; set; }
    }

    /// <summary>
    /// 角色数据传输对象,用于接收复杂结构的 JSON 数据
    /// </summary>
    public class UserRoleJsonDto
    {
        /// <summary>
        /// 用户账号
        /// </summary>
        public string UserAccount { get; set; }

        /// <summary>
        /// 用户真实姓名
        /// </summary>
        public string? UserRealName { get; set; }

        /// <summary>
        /// 冻结标识
        /// </summary>
        public int IsDelete { get; set; } = 0;


        /// <summary>
        /// 权限详细信息列表
        /// </summary>
        public List<RoleDetailDto> Roles { get; set; }

    }
}

2.2 UserRoleDto

namespace OPC.PR.Application.Objects
{
    /// <summary>
    /// 角色数据传输对象
    /// </summary>
    public class UserRoleDto
    {
        /// <summary>
        /// 用户账号
        /// </summary>
        public string UserAccount { get; set; }

        /// <summary>
        /// 用户真实姓名
        /// </summary>
        public string? UserRealName { get; set; }

        /// <summary>
        /// 所属权限组的名称(全部时为*)
        /// </summary>
        public string? RoleName { get; set; }

        /// <summary>
        /// 所属权限组的类型
        /// </summary>
        public int RoleType { get; set; }

        /// <summary>
        /// 所属权限大类下得子类Code
        /// </summary>
        public string[]? SubRoles { get; set; }

        /// <summary>
        /// 冻结标识
        /// </summary>
        public int IsDelete { get; set; } = 0;

    }
}

2.3 UserRoleEntity

namespace OPC.PR.Application.Entity
{
    [SugarTable("b_user_role", "用户权限配置表")]
    [Tenant(DBConfigIds.PR)]
    public class UserRoleEntity : EntityBase
    {
        /// <summary>
        ///  用户账号
        /// </summary>
        public string? UserAccount { get; set; }
        /// <summary>
        ///   用户姓名
        /// </summary>
        public string? UserRealName { get; set; }
        /// <summary>
        ///  所属权限组的名称(全部时为*)
        /// </summary>
        public string? RoleName { get; set; }
        /// <summary>
        /// 所属权限组的类型
        /// </summary>
        public byte? RoleType { get; set; }
        /// <summary>
        /// 所属权限大类下得子类Code,多个时以逗号分隔
        /// </summary>
        public string? SubRole { get; set; }


    }
}

3. Service

3.1 展示角色全部权限

/// <summary>
/// 展示角色全部权限
/// </summary>
/// <param name="RoleType"></param>
/// <param name="UserAccount"></param>
/// <returns></returns>
[DisplayName("展示角色全部权限"), ActionName("GetRole")]
[HttpPost]
[NonUnify]
public dynamic GetRole(string RoleType, string UserAccount)
{
    _logger.LogInformation("开始调用 GetRole 方法,权限类型: {RoleType}, 用户账号: {UserAccount}", RoleType, UserAccount);
    // 转化成全部情况
    if (RoleType == "*") RoleType = "5";
    // 获取全部权限
    List<UserRoleEntity>? getResult;
    try
    {
        getResult = _bllrole.GetAllUserRole(RoleType: int.Parse(RoleType), UserAccount);
        // 将数据库查询结果映射到 UserRoleDto 列表
        var qresult = getResult.Select(x => new UserRoleDto
        {
            UserAccount = x.UserAccount, // 映射用户账号
            UserRealName = x.UserRealName, // 映射用户真实姓名
            RoleName = x.RoleName, // 映射角色名称
            RoleType = x.RoleType.HasValue ? (int)x.RoleType : 0, // 映射角色类型,若为空则设为 0
            SubRoles = x.SubRole != null ? x.SubRole.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) : new string[] { }, // 映射子权限,将其分割为数组
            IsDelete = x.IsDelete ? 1 : 0 // 映射删除状态,已删除标识为 1,未删除为 0
        }).ToList();
        _logger.LogInformation("开始调用 GetRole 方法,权限类型: {RoleType}, 用户账号: {UserAccount}", RoleType, UserAccount);
    }
    catch (Exception ex)
    {
        _logger.LogError(ex, "获取用户权限时发生错误,用户账号: {UserAccount}, 权限类型: {RoleType}", UserAccount, RoleType);
        return HttpMsgResult.FailureResult(msg: "获取用户权限时发生错误.");
    }
    // 过滤掉已软删除的记录
    var activeRoles = getResult.Where(r => !r.IsDelete).ToList();
    _logger.LogInformation("找到 {Count} 条有效权限记录,用户账号: {UserAccount}", activeRoles.Count, UserAccount);
    // 构造固定字段名称的数据
    var data = activeRoles.Select(role =>
    {
        // 调用判断器获取字段名
        (string fieldName1, string fieldName2) = GetFieldNames((int)role.RoleType);
        // 构造字段名和子权限
        return new Dictionary<string, object>
{
    { fieldName1, role.RoleName },
    { fieldName2, role.SubRole} // 直接返回子权限列表
};
    }).ToList();

    _logger.LogInformation("结束调用 GetRole 方法");
    return data;
}

/// <summary>
/// 根据RoleType生成字段名称
/// </summary>
/// <param name="roleType">角色类型</param>
/// <returns>字段名称元组</returns>
private (string fieldName1, string fieldName2) GetFieldNames(int roleType)
{
    return roleType switch
    {
        1 => ("A1", "A2"),
        2 => ("D", "Dsub"),
        3 or 4 => ("Other1", "Other2"),
        _ => ("Error1", "Error2"),
    };
}

3.2 保存用户权限

/// <summary>
/// 保存用户权限
/// </summary>
/// <param name="userRoleJsonDto"> Body格式的数据,不多传输</param>
[DisplayName("保存用户权限"), ActionName("SetUserRole")]
[HttpPost]
[NonUnify]
public async Task<dynamic> SetUserRole(UserRoleJsonDto userRoleJsonDto)
{
    _logger.LogInformation("开始保存用户权限,用户账号: {UserAccount}", userRoleJsonDto.UserAccount);

    // 解析 JSON DTO 为多个 UserRoleDto
    List<UserRoleEntity>? userRoleDtos = _bllrole.ParseJsonDtoToUserRoleDtos(userRoleJsonDto);

    if (userRoleDtos == null || !userRoleDtos.Any())
    {
        _logger.LogWarning("未找到有效的用户角色数据,用户账号: {UserAccount}", userRoleJsonDto.UserAccount);
        return HttpMsgResult.FailureResult(msg: "未找到有效的用户角色数据。");
    }

    // 查询数据库中的现有权限
    List<UserRoleEntity>? allCurrentRoles = _bllrole.GetAllUserRole(5, userRoleJsonDto.UserAccount);

    if (userRoleJsonDto.Roles.Any(s => s.RoleName == "*"))
    {
        // 查询数据库中是否存在RoleName为*的记录
        UserRoleEntity? existingStarRole = allCurrentRoles.FirstOrDefault(w => w.RoleName == "*");

        if (existingStarRole == null)
        {
            // 将相同 RoleType 的所有记录加入软删除队列
            List<UserRoleEntity>? rolesToDelete = allCurrentRoles.Where(w => userRoleJsonDto.Roles.Any(s => s.RoleType == w.RoleType)).ToList();
             _roleDB.FakeDeleteRange(rolesToDelete);
            _logger.LogInformation("批量删除完成,删除数量: {Count}", rolesToDelete.Count);

            // 构造新增的*权限
            var starRoleEntity = new UserRoleEntity
            {
                UserAccount = userRoleJsonDto.UserAccount,
                UserRealName = userRoleJsonDto.UserRealName, // 从 JsonDto 获取的真实用户姓名
                RoleType = Convert.ToByte(userRoleJsonDto.Roles.FirstOrDefault(r => r.RoleName == "*")?.RoleType),
                RoleName = "*",
                SubRole = string.Join(",", userRoleJsonDto.Roles.FirstOrDefault(r => r.RoleName == "*")?.SubRoles ?? Array.Empty<string>()),
                IsDelete = false
            };

            _roleDB.Insert(starRoleEntity);
            _logger.LogInformation("新增角色: *, 类型: {RoleType}, 用户账号: {UserAccount}", starRoleEntity.RoleType, starRoleEntity.UserAccount);
            return HttpMsgResult.SuccessResult(msg: "新增角色全权限。");
        }
        else
        {
            _logger.LogError("已经是全权限");
            return HttpMsgResult.FailureResult(msg: "已经是全权限。");
        }
    }

    // 删除队列
    var DeleteRoles = allCurrentRoles.Where(w => userRoleJsonDto.Roles.Any(s => s.RoleType == w.RoleType) && !userRoleJsonDto.Roles.Any(s => s.RoleType == w.RoleType && s.RoleName == w.RoleName)).ToList();
    // 更新队列 - 保留从数据库中获取的原始记录,但更新 DTO 中传入的新值
    var updateRoles = userRoleDtos.Where(r => allCurrentRoles.Any(existingRole => existingRole.RoleType == r.RoleType && existingRole.RoleName == r.RoleName)) .Select(r =>{var originalEntity = allCurrentRoles.FirstOrDefault(existingRole => existingRole.RoleType == r.RoleType &&existingRole.RoleName == r.RoleName);if (originalEntity != null){originalEntity.UserRealName = r.UserRealName;originalEntity.SubRole = r.SubRole;
      originalEntity.IsDelete = r.IsDelete;}return originalEntity;}) .ToList();

    // 增加队列 - 构建新的实体,保持从 DTO 传入的数据
    var addRoles = userRoleDtos.Where(r => !allCurrentRoles.Any(existingRole => existingRole.RoleType == r.RoleType &&
    existingRole.RoleName == r.RoleName)).Select(r => new UserRoleEntity{UserAccount = r.UserAccount,UserRealName = r.UserRealName, RoleType = r.RoleType,
      RoleName = r.RoleName,SubRole = r.SubRole,IsDelete = r.IsDelete}) .ToList();

    try
    {
        // 批量执行删除操作
        if (DeleteRoles.Any())
        {
            _roleDB.FakeDeleteRange(DeleteRoles);
            _logger.LogInformation("批量删除完成,删除数量: {Count}", DeleteRoles.Count);
        }

        // 批量执行更新操作
        if (updateRoles.Any())
        {
            _roleDB.UpdateRange(updateRoles);
            _logger.LogInformation("批量更新完成,更新数量: {Count}", updateRoles.Count);
        }

        // 批量执行新增操作
        if (addRoles.Any())
        {
            _roleDB.InsertRange(addRoles);
            _logger.LogInformation("批量新增完成,新增数量: {Count}", addRoles.Count);
        }

        _logger.LogInformation("用户权限保存完成,用户账号: {UserAccount}", userRoleJsonDto.UserAccount);
        return HttpMsgResult.SuccessResult(msg: "用户操作已完成。");
    }
    catch (Exception ex)
    {
        _logger.LogError(ex, "批量操作时发生错误,用户账号: {UserAccount}", userRoleJsonDto.UserAccount);
        return HttpMsgResult.FailureResult(msg: "用户操作失败。");
    }
    finally
    {
        _logger.LogInformation("保存用户权限操作结束,用户账号: {UserAccount}", userRoleJsonDto.UserAccount);
    }
}

3.3 软删除用户权限

/// <summary>
/// 软删除用户权限
/// </summary>
/// <param name="RoleType">权限类型</param>
/// <param="UserAccount">用户账号</param>
/// <param="RoleName">权限组名称(可选)</param>
/// <returns></returns>
public async Task<dynamic> DeleteUserRole(int RoleType, string UserAccount)
{
    _logger.LogInformation("开始软删除角色,用户账号: {UserAccount}, 权限类型: {RoleType}", UserAccount, RoleType);

    if (string.IsNullOrEmpty(UserAccount))
    {
        _logger.LogWarning("用户账号不能为空。");
        return HttpMsgResult.FailureResult(msg: "用户账号不能为空。");
    }

    try
    {
        // 调用 BLL 的 DeleteUserRole 方法
        var result = await _bllrole.DeleteUserRole(RoleType, UserAccount, null);
        return result;
    }
    catch (Exception ex)
    {
        _logger.LogError(ex, "软删除角色时发生错误,用户账号: {UserAccount}, 权限类型: {RoleType},", UserAccount, RoleType);
        return HttpMsgResult.FailureResult(msg: "删除用户权限时发生错误:" + ex.Message);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2118429.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最新前端开发VSCode高效实用插件推荐清单

在此进行总结归类工作中用到的比较实用的、有助于提升开发效率的VSCode插件。大家有其他的好插件推荐的也欢迎留言评论区哦&#x1f604; 基础增强 Chinese (Simplified) Language Pack: 提供中文界面。 Code Spell Checker: 检查代码中的拼写错误。 ESLint: 集成 ESLint&…

AIoTedge边缘计算+边缘物联网平台

在数字化转型的浪潮中&#xff0c;AIoTedge边缘计算平台以其边云协同的架构和强大的分布式AIoT处理能力&#xff0c;正成为推动智能技术发展的关键力量。AIoTedge通过在数据源附近处理信息&#xff0c;实现低延迟、快速响应&#xff0c;增强了应用的实时性。同时&#xff0c;它…

CCF推荐C类会议和期刊总结:(计算机网络领域)

CCF推荐C类会议和期刊总结&#xff08;计算机网络领域&#xff09; 在计算机网络领域&#xff0c;中国计算机学会&#xff08;CCF&#xff09;推荐的C类会议和期刊为研究者提供了广泛的学术交流平台。以下是对所有C类会议和期刊的总结&#xff0c;包括全称、出版社、dblp文献网…

DMDPC单副本集群安装

1. 环境描述 2. 部署步骤 2.1. 安装DM数据库软件启动DMAP [dmdbalei1 ~]$ DmAPService status DmAPService (pid 1269) is running.2.2. 初始化数据库实例 [dmdbalei1 data]$ dminit path/dmdba/data/sp1 instance_nameSP1 port_num5236 ap_port_num6000 dpc_modeSP initdb …

野火霸天虎V2学习记录

文章目录 嵌入式开发常识汇总1、嵌入式Linux和stm32之间的区别和联系2、stm32程序下载方式3、Keil5安装芯片包4、芯片封装种类5、STM32命名6、数据手册和参考手册7、什么是寄存器、寄存器映射和内存映射8、芯片引脚顺序9、stm32芯片里有什么10、存储器空间的划分11、如何理解寄…

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6&#xff1a;深入图形与图形分组、自定义节点、节点动画&#xff08;下&#xff09;_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中&#xff0c;应该怎样去计算和绘制图形&#xff0c;如何给一个图形制作不间断的动画&#xff0c;以及在鼠…

长芯微国产LS0104电平转换器/电平移位器P2P替代TXS0104

LS0104这个4位非反相转换器是一个双向电压电平转换器&#xff0c;可用于建立数字混合电压系统之间的切换兼容性。它使用两个单独的可配置电源轨支持1.65V至5.5V工作电压的端口同时它跟踪VCCA电源和支持的B端口工作电压从2.3V到5.5V&#xff0c;同时跟踪VCCB供应。这允许更低和更…

【C++】stackqueuedeque

目录 一、stack&#xff1a; 1、栈的介绍&#xff1a; 2、栈的使用&#xff1a; 3、栈的成员函数的模拟实现&#xff1a; 二、queue: 1、队列的介绍&#xff1a; 2、队列的使用&#xff1a; 3、队列的模拟实现&#xff1a; 三、deque&#xff1a; deque的底层结构&am…

电脑丢失msvcp120.dll问题原因及详细介绍msvcp120.dll丢失的解决方法

在使用 Windows 操作系统时&#xff0c;你可能会遇到一个常见的错误提示&#xff1a;“程序无法启动&#xff0c;因为计算机中丢失 msvcp120.dll”。这个错误通常意味着你的系统中缺少了一个重要的动态链接库文件&#xff0c;即msvcp120.dll。这个文件是 Microsoft Visual C 20…

一文读懂SpringMVC的工作原理

前言 MVC是经典的软件架构设计模式&#xff0c;几乎在各个领域各种开发语言中&#xff0c;均采纳了这个思想。此刻博主突然想到了Thinking in xxx系列设计书籍。换句话说&#xff0c;就是“各人自扫门前雪”和“术业有专攻”。当职责分配得当后&#xff0c;剩下的就是发挥各“…

AI行业应用(不定期更新)

ChatPDF 可以让你上传一个 PDF 文件&#xff0c;然后针对这个 PDF 进行小结和提问。你可以把各种各样你要研究的分析报告交给它&#xff0c;快速获取到想要知道的信息。https://www.chatpdf.com/

全志A527 A133 A523 T527 T133 H6 H8应用无法开启后台服务

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改4.1 代码修改方法14.2 代码修改方法24.3 代码修改方法35.彩蛋1.前言 像全志的很多平台,普通的app并不能正常的启动后台的服务,这样对于应用层很困扰,无法启动后台的服务,功能就不能正常使用…

2024最新软件测试面试题(带答案)

1. 请自我介绍一下(需简单清楚的表述自已的基本情况&#xff0c;在这过程中要展现出自信&#xff0c;对工作有激情&#xff0c;上进&#xff0c;好学) 面试官您好&#xff0c;我叫###&#xff0c;今年26岁&#xff0c;来自江西九江&#xff0c;就读专业是电子商务&#xff0c;毕…

新160个crackme - 052-tc.2

运行分析 提示选择Keyfile&#xff0c;选择后弹出错误的Keyfile&#xff0c;需要先破解Keyfile还需要破解Name和Serial PE分析 Delphi程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 ida找到Keyfile关键字符串&#xff0c;双击进入 ida动态调试&#xff0c;找到关…

moment() 时间

指定日期月初/月末 moment(自定义时间) 当月月初&#xff08;假设当月8月&#xff09;2024-08-01 00:00:00 moment().startOf(“month”).format(“YYYY-MM-DD HH:mm:ss”) 当月月末 2024-08-31 23:59:59 moment().endOf(“month”).format(“YYYY-MM-DD HH:mm:ss”) 加法 ad…

【小项目】python贪吃蛇小游戏设计

引入pygame库 添加pygame库&#xff0c;在cmd中输入以下代码&#xff0c;进行安装。如果输入pip install pygame出现以下报错&#xff0c;可以尝试在前面加入python3 -m。 python3 -m pip install pygame 贪吃蛇代码 import pygame import time import random# 初始化 Pygam…

使用yolov8识别+深度相机+机械臂实现垃圾分拣机械臂(代码分享)

文章目录 垃圾分拣机械臂视频演示程序主代码完整代码链接 垃圾分拣机械臂 视频演示 点击查看 使用YoloV8做的目标检测&#xff0c;机械臂手眼标定使用Aruco的方式&#xff0c;通过深度相机获取三维坐标&#xff0c;与机械臂坐标系之间的转化&#xff0c;得到抓取的坐标深度相…

猜数游戏-Rust 入门经典案例

文章目录 发现宝藏1. 项目概述2. 项目结构3. 实现游戏4. 依赖管理5. 测试6. 改进和扩展7. 总结 发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【宝藏入口】。 在这篇博客中&#xff0c;我们将…

网站钓鱼——挂马技术手段介绍

更多网安实战内容&#xff0c;可前往无问社区查看http://wwlib.cn/index.php/artread/artid/10194.html 网站挂马目前已经成为流氓软件以及红队人员快速获取目标主机权限的常用手段之一&#xff0c;在长时间的实战中也是出现了层出不穷的钓鱼方法&#xff0c;这次分享一下实际…

酒茶香链接心灵——探寻现代人幸福生活

科技在飞速发展&#xff0c;人类社会以前所未有的速度向前跃进&#xff0c;物质世界的繁荣达到了前所未有的高度。 然而&#xff0c;这光鲜的背后&#xff0c;却无形中拉远了人与人之间的距离&#xff0c;割裂了传统文化的根脉。 传统文化势弱、“快餐文化”层出不穷&#xff0…