软件生命周期下GPT的应用

一. 背景

六月中旬, 又到了一年一度的分享季, 分享这一年来工作中收获的心得。
关于这次分享,我想了很多, 也询问了一些同事的看法: 大家都倾向于技术方面的分享.
而在技术分享方面, 我还是比较自信的: 毕竟从自己的博客中随便挑一篇, 然后稍加润色就可以了.
但总觉得那样去准备课程会很无聊, 并且没有挑战性, 所以就打算构思要写点什么新东西.
在确定文章要写什么的时候, 纠结了好久. 但在某晚洗澡的时候, 我突然就想到的文章的方向——GPT

在这个大方向上,我想到了两个细分方向:

  1. 开发中使用——开发视角下GPT的使用
  2. 整个项目周期下应用——软件生命周期下GPT的应用

需要额外说明的是,我首先想到的就是第一个方向. 且对于我来说,第一个更好写.
但是本着实用性, 系统性原则,我选择了第二个. 探究gpt在项目周期上使用的可能性.


二. 软件生命周期

软件生命周期通常包括需求分析、设计、实现、测试与验证、部署与持续集成以及维护和演进六个阶段

  1. 需求分析(Requirements Analysis)

    • 在这个阶段,团队会与客户或利益相关者紧密合作,收集并明确软件需要满足的需求。
    • 需求分析涉及识别、记录、分析和验证软件需求,以确保开发团队理解并同意最终产品的目标和约束。
    • 输出: 需求清单, 需求规格说明书
  2. 设计(Design)

    • 设计阶段将需求转化为软件系统的详细设计。
    • 这包括系统架构、用户界面设计、数据库设计以及任何必要的算法和数据结构设计。
    • 设计阶段的目标是创建一个可实现的蓝图,同时考虑到性能、可扩展性、安全性和易用性等因素。
    • 输出: 原型图, 概要设计, 详细设计, 测试用例
  3. 实现(Implementation/Coding)

    • 在这个阶段,开发人员根据设计文档编写源代码。
    • 开发人员会进行单元测试,以确保他们的代码按预期工作。
    • 输出: 项目代码, 接口文档
  4. 测试与验证(Testing and Validation)

    • 测试阶段旨在发现和修复软件中的错误、缺陷和不符合需求的地方。
    • 测试包括单元测试、集成测试、系统测试和验收测试等多个层次。
    • 验证则确保软件满足所有指定的需求,并达到既定的质量标准。
    • 输出: 测试报告
  5. 部署与持续集成(Deployment and Continuous Integration)

    • 部署是将软件从开发环境转移到生产环境的过程。
    • 持续集成是一种软件开发实践,它要求团队定期将代码集成到共享仓库中,并进行自动化构建和测试。
    • 这个阶段还涉及配置生产环境、监控软件性能和确保软件的安全性和稳定性。
    • 输出: 当前版本各端生产环境代码
  6. 维护和演进(Maintenance and Evolution)

    • 软件一旦部署,就需要进行持续的维护和更新。
    • 维护包括修复错误、应对安全漏洞、更新依赖项和响应用户反馈。
    • 演进则涉及根据新的需求或市场趋势对软件进行功能增强或重构。
    • 输出: 当前项目各版本相关代码和配置文档

三. 常用GPT工具

  • ChatGPT-3.5/4: https://chat.openai.com/
    综合使用体验第一, 适合公司自带vpn的场景下使用, 否则可用性, 稳定性很难保证.
  • 闻心一言: https://yiyan.baidu.com/
    中文语料丰富, 日常办公开发使用基本够用,
  • 秘塔AI: https://metaso.cn/
    搜索风格偏学术, 适合论文以及研究报告使用(会同时生成大纲和ppt).
  • 天工AI: https://metaso.cn/
    AI场景多, 包括: AI写作, AI音乐, AI PPT, AI报志愿, 英语口语练习等(会同时生成大纲, 思维导图和ppt).
  • KimiAI: https://kimi.moonshot.cn/
    支持读取文档, 读取链接操作, 适合数据分析时使用.

四. 使用

4.1 需求分析阶段

在软件开发的需求分析阶段,GPT可以用于:

  • 帮助更准确地理解和记录需求,协助起草和完善用户故事或用例

    假如你是一位资深的产品经理, 客户想要做一个课程培训模块. 下面是客户的口述, 请你结合客户的口述以及相关项目经验充分理解用户需求并制作需求清单. 下面是客户的口述: xxx. 其中需要注意:xxx

    输入:
    假如你是一位资深的产品经理, 客户想要做一个课程培训模块. 下面是客户的口述, 请你结合客户的口述以及相关项目经验生成需求清单. 注意需要根据情况补出对应的字段
    我们做课程培训, 是为了让员工更加积极的参加课程培训并且申报课程. 课程列表审核通过之后才能被看到, 被看到的就可以进行报名. 然后每个人都可以申报课程, 申报成功了呢就可以被看到了. 我(管理员)可以进行审核, 审核成功之后员工可以进行签到, 评价. 评价包括打分和课程建议. 我需要看到每个课程的总分和平均分, 以及每个课程的评价情况.
    
    输出:
    课程培训模块需求清单(摘自闻心一言)
    一、用户角色
    员工:参与课程培训、申报课程、报名课程、签到、评价课程。
    管理员:审核课程、查看课程评价、统计数据。
    
    二、功能需求
    1. 课程申报
    申报入口:员工可以在系统中提交课程申报,包括课程的基本信息,如:
    课程名称
    课程描述(课程目标、内容等)
    课时
    授课人
    申报人(员工姓名、ID等)
    申报时间
    申报状态:申报后的课程状态默认为“待审核”。
    2. 课程审核
    审核界面:管理员可在系统中查看所有待审核的课程列表,包括课程的基本信息和申报人信息。
    审核操作:管理员可以对课程进行“通过”或“拒绝”的审核操作,审核结果需记录。
    审核结果:审核通过的课程状态变为“已发布”,并在课程列表中展示;审核拒绝的课程状态仍为“待审核”,并需显示拒绝原因。
    3. 课程报名
    报名入口:员工可以查看已发布的课程列表,并选择感兴趣的课程进行报名。
    报名信息:员工报名时需填写个人信息,如姓名、部门、职位等,并与课程信息关联。
    报名状态:报名成功后,员工的报名状态变为“已报名”,并可在系统中查看自己的报名信息。
    4. 签到与评价
    签到功能:员工在参加课程时需进行签到,签到信息需记录,包括签到时间、签到人、课程名称等。
    评价功能:课程结束后,员工可以对课程进行评价,评价内容包括:
    打分(如五星评分制)
    课程建议(文本输入)
    评价记录:评价信息需记录,包括评价人、评价时间、打分、课程建议等,并与课程信息关联。
    5. 数据统计与查看
    评价统计:管理员可查看每个课程的评价数据,包括总分、平均分、评价数量等。
    评价详情:管理员可查看每个课程的评价详情,包括每条评价的具体内容、打分、评价人信息等。
    报表导出:管理员可将评价数据导出为报表,以便进一步分析或分享。
    
    三、非功能需求
    系统性能:确保系统在高并发情况下仍能稳定运行,响应速度快。
    安全性:保证用户数据的安全,采用合适的加密和验证机制。
    易用性:界面设计简洁明了,操作流程直观易懂,提供必要的帮助文档或提示信息。
    可扩展性:系统应具备良好的可扩展性,以便未来添加新功能或调整现有功能。
    
    四、其他注意事项
    通知机制:当课程审核结果出来、有新的评价时,系统应能自动发送通知给相关用户。
    权限管理:确保不同用户角色只能访问其权限范围内的功能和数据。
    数据备份:定期备份系统数据,以防数据丢失或损坏。
    日志记录:记录系统操作日志,以便出现问题时进行追踪和排查。
    

    ps: 需要说明的是, 在需求分析时主要还是靠自己, AI是辅助工具. 仅作为帮助自己梳理忽略的需求点时使用

4.2 设计阶段

在软件设计阶段,GPT的应用包括:

  • 根据需求清单生成数据库建表语句和数据库模型
  • 生成项目概要和详细设计文档的部分内容
4.2.1. 生成数据库建表语句
输入: 
根据上述需求清单, 请帮我生成对应的数据库建表语句, 需要在每个字段上加上中文注释

输出: 
为了根据上述需求清单生成对应的数据库建表语句,并在每个字段上加上中文注释,我们可以设计几个主要的表:courses(课程表)、course_applications(课程申报表)、enrollments(报名表)、sign_ins(签到表)、evaluations(评价表)。以下是这些表的建表语句:

1. 课程表(courses)

CREATE TABLE courses (  
    id INT AUTO_INCREMENT PRIMARY KEY COMMENT '课程ID',  
    name VARCHAR(255) NOT NULL COMMENT '课程名称',  
    description TEXT COMMENT '课程描述',  
    hours INT COMMENT '课时',  
    instructor VARCHAR(255) COMMENT '授课人',  
    status ENUM('pending', 'published', 'rejected') DEFAULT 'pending' COMMENT '课程状态(待审核、已发布、已拒绝)',  
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'  
) COMMENT='课程信息表';
2. 课程申报表(course_applications)

CREATE TABLE course_applications (  
    id INT AUTO_INCREMENT PRIMARY KEY COMMENT '申报ID',  
    course_id INT NOT NULL COMMENT '课程ID',  
    applicant_id INT NOT NULL COMMENT '申报人ID(员工ID)',  
    application_details TEXT COMMENT '申报详情',  
    status ENUM('pending', 'approved', 'rejected') DEFAULT 'pending' COMMENT '审核状态(待审核、已批准、已拒绝)',  
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '申报时间',  
    FOREIGN KEY (course_id) REFERENCES courses(id) ON DELETE CASCADE,  
    FOREIGN KEY (applicant_id) -- 假设有员工表,这里需要指向员工表的ID  
) COMMENT='课程申报表';
注意:这里假设有一个员工表(employees),但在此建表语句中未给出,因为具体结构依赖于实际应用。applicant_id 需要指向该员工表的ID。

3. 报名表(enrollments)

CREATE TABLE enrollments (  
    id INT AUTO_INCREMENT PRIMARY KEY COMMENT '报名ID',  
    course_id INT NOT NULL COMMENT '课程ID',  
    employee_id INT NOT NULL COMMENT '员工ID',  
    enrollment_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '报名时间',  
    FOREIGN KEY (course_id) REFERENCES courses(id) ON DELETE CASCADE,  
    FOREIGN KEY (employee_id) -- 假设有员工表,这里需要指向员工表的ID  
) COMMENT='课程报名表';

4. 签到表(sign_ins)

CREATE TABLE sign_ins (  
    id INT AUTO_INCREMENT PRIMARY KEY COMMENT '签到ID',  
    course_id INT NOT NULL COMMENT '课程ID',  
    employee_id INT NOT NULL COMMENT '员工ID',  
    sign_in_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '签到时间',  
    FOREIGN KEY (course_id) REFERENCES courses(id) ON DELETE CASCADE,  
    FOREIGN KEY (employee_id) -- 假设有员工表,这里需要指向员工表的ID  
) COMMENT='课程签到表';
5. 评价表(evaluations)

CREATE TABLE evaluations (  
    id INT AUTO_INCREMENT PRIMARY KEY COMMENT '评价ID',  
    course_id INT NOT NULL COMMENT '课程ID',  
    employee_id INT NOT NULL COMMENT '评价人ID(员工ID)',  
    rating INT COMMENT '打分(例如1-5分)',  
    suggestions TEXT COMMENT '课程建议',  
    evaluation_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '评价时间',  
    FOREIGN KEY (course_id) REFERENCES courses(id) ON DELETE CASCADE,  
    FOREIGN KEY (employee_id) -- 假设有员工表,这里需要指向员工表的ID  
) COMMENT='课程评价表';

请注意,上述建表语句中的FOREIGN KEY约束需要依赖于实际存在的其他表(如员工表)的ID字段。在实际应用中,你需要确保这些表已经存在,并且相应的字段(如employee_id)已经定义好。此外,根据实际需求,可能还需要为这些表添加更多的字段或索引。
4.2.2. 生成数据库模型
输入:
根据上述建表语句, 生成对应数据库模型表格

基于上述的建表语句,我们可以为每个表生成一个简化的数据库模型表格表示。这些表格将以文本形式描述,模拟实际数据库设计工具中的表格视图。请注意,实际的数据库设计工具(如 MySQL Workbench, PostgreSQL pgAdmin, ER/Studio 等)会提供更图形化和详细的表示方式。

  1. 课程表(courses)

    字段名称字段类型字段含义是否主键是否允许为空默认值备注
    idINT课程ID-
    nameVARCHAR课程名称-
    descriptionTEXT课程描述-
    hoursINT课时-
    instructorVARCHAR授课人-
    statusENUM课程状态pending枚举值:pending, published, rejected
    created_atTIMESTAMP创建时间CURRENT_TIMESTAMP
  2. 课程申报表(course_applications)

    字段名称字段类型字段含义是否主键是否允许为空默认值备注
    idINT申报ID-
    course_idINT课程ID-外键,指向courses表
    applicant_idINT申报人ID-假设是员工ID,外键指向员工表
    application_detailsTEXT申报详情-
    statusENUM审核状态pending枚举值:pending, approved, rejected
    created_atTIMESTAMP申报时间CURRENT_TIMESTAMP
  3. 报名表(enrollments)

    字段名称字段类型字段含义是否主键是否允许为空默认值备注
    idINT报名ID-
    course_idINT课程ID-外键,指向courses表
    employee_idINT员工ID-外键,指向员工表
    enrollment_timeTIMESTAMP报名时间CURRENT_TIMESTAMP
  4. 签到表(sign_ins)

    字段名称字段类型字段含义是否主键是否允许为空默认值备注
    idINT签到ID-
    course_idINT课程ID-外键,指向courses表
    employee_idINT员工ID-外键,指向员工表
    sign_in_timeTIMESTAMP签到时间CURRENT_TIMESTAMP
  5. 评价表(evaluations)

    字段名称字段类型字段含义是否主键是否允许为空默认值备注
    idINT评价ID-
    course_idINT课程ID-外键,指向courses表
    employee_idINT评价人ID-外键,指向员工表
    ratingINT打分-假设为1-5分制
4.2.3 生成接口文档
输入:
根据需求分析为我设计接口文档

在这里插入图片描述


4.3 实现阶段

  • 分析代码含义: 识别复杂代码中的逻辑, 帮助我们快速属性代码
  • 代码自动补全:帮助程序员快速生成代码片段,提高编码效率。
  • 错误分析与修复:分析代码中的错误信息和日志,提供可能的修复建议。
4.3.1 分析代码含义

这段代码什么意思 public static TemporalAdjuster next(DayOfWeek dayOfWeek) {
int dowValue = dayOfWeek.getValue();
return (temporal) -> {
int calDow = temporal.get(DAY_OF_WEEK);
int daysDiff = calDow - dowValue;
return temporal.plus(daysDiff >= 0 ? 7 - daysDiff : -daysDiff, DAYS);
};
}

4.3.2 代码自动补全

开发这里, 需要在理解需求的基础上进行设计, 尽量让逻辑覆盖需求.
这里建议使用idea的同学, 下载一下通义灵码插件. 可以进行代码补全

  • 通过行注释补全
    在这里插入图片描述

  • 通过方法注释补全

    补全下面方法
    /**
    * 比较输入的日期是否在两个日期之间
    * @param planStartDate 待比较的开始日期
    * @param planEndDate 待比较的结束日期
    * @param inputDate 输入的日期
    * @return -1:小于,1:大于,2:在计划开始时间和结束时间之间
    */
    public static int inputDateIsBetween(String planStartDate, String planEndDate, LocalDate inputDate) {}

    为了补全这个方法,我们需要将 planStartDate 和 planEndDate 这两个字符串参数转换为 LocalDate 对象,以便与 inputDate 进行比较。以下是补全后的方法:
    
    java
    import java.time.LocalDate;  
    import java.time.format.DateTimeFormatter;  
    import java.time.format.DateTimeParseException;  
      
    public class DateComparer {  
      
        /**  
         * 比较输入的日期是否在两个日期之间  
         * @param planStartDate  待比较的开始日期(字符串格式)  
         * @param planEndDate    待比较的结束日期(字符串格式)  
         * @param inputDate      输入的日期(LocalDate格式)  
         * @return -1:小于, 1:大于, 2:在计划开始时间和结束时间之间  
         * @throws IllegalArgumentException 如果计划开始日期晚于结束日期,或者日期字符串格式不正确  
         */  
        public static int inputDateIsBetween(String planStartDate, String planEndDate, LocalDate inputDate) {  
            // 定义日期格式  
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");  
      
            try {  
                // 将字符串日期转换为LocalDate  
                LocalDate startDate = LocalDate.parse(planStartDate, formatter);  
                LocalDate endDate = LocalDate.parse(planEndDate, formatter);  
      
                // 检查计划开始日期是否晚于计划结束日期  
                if (startDate.isAfter(endDate)) {  
                    throw new IllegalArgumentException("计划开始日期不能晚于计划结束日期");  
                }  
      
                // 比较输入日期是否在计划日期范围内  
                if (inputDate.isBefore(startDate)) {  
                    return -1;  
                } else if (inputDate.isAfter(endDate)) {  
                    return 1;  
                } else {  
                    return 2; // 输入日期在计划开始和结束日期之间  
                }  
            } catch (DateTimeParseException e) {  
                // 如果日期字符串格式不正确,则抛出IllegalArgumentException  
                throw new IllegalArgumentException("日期字符串格式不正确:" + e.getMessage(), e);  
            }  
        }  
      
        // ... 其他代码(如果需要)  
    }
    在这个补全后的方法中,我添加了一个 try-catch 块来捕获 DateTimeParseException,这是一个可能在尝试将字符串解析为 LocalDate 时抛出的异常。如果捕获到这个异常,我会抛出一个 IllegalArgumentException,其中包含有关错误的更多信息。这样做可以确保方法的调用者能够清楚地知道发生了什么问题,并且可以根据需要进行处理。
    
    此外,我还修改了方法的文档注释,以包括可能抛出的异常类型及其描述。这是一个良好的编程实践,因为它可以帮助其他开发者更好地理解你的代码和它的行为。
    
4.3.3 错误分析与修复
输入: 
这个sql执行出错, 请帮我看看是什么问题 
SELECT approval_record_id,course_id,course_theme,course_type,course_description,course_propose,course_duration,course_hour_number,course_open_level,train_method,teacher_id,teacher_name,max_enrollment,audit_status,refuse_season,audit_time,auditor,dept_id,dept_name,reamrk 
FROM train_course_approval_record 
WHERE  JSON_EXTRACT(reamrk, '$.courseTheme') LIKE CONCAT('%', "a", '%')")

4.4 测试与验证

在软件测试与验证阶段,GPT的应用包括:

  • 测试用例生成:根据功能需求和代码逻辑,自动生成覆盖全面的测试用例。
  • 自动化测试报告生成:根据测试结果和反馈,自动生成测试报告并进行分析。

请根据上面的需求分析和接口文档来设计测试用例

4.5 部署与持续集成

在软件部署与持续集成阶段,GPT可以:

4.6 维护和演进

在软件维护和演进阶段,GPT的应用包括:

  • 用户反馈分析:根据用户反馈和使用数据,提供产品改进和升级的建议

    用户经使用后反馈, 课程评价得分不够智能, 我该如和进行优化呢?

    如果课程评价得分被用户反馈为不够智能,那么可能需要进行一系列的优化来提升评价系统的智能化水平。以下是一些优化策略和建议:
    
    引入多维度评价指标:
    现有的评价系统可能只依赖于简单的评分(如1-5星)或简短的文字评价。可以引入更多维度的评价指标,如教学内容的清晰度、讲师的表达能力、课程的实用性、互动性、难度适宜度等。这些多维度的评价可以更全面地反映课程的质量。
    
    采用智能分析技术:
    利用自然语言处理(NLP)技术来分析用户的文字评价,识别出用户对课程的正面和负面反馈,并自动分类和统计。
    应用机器学习算法来预测用户对课程的评分或偏好,基于用户的历史评价、行为数据和其他用户的相似评价。
    
    个性化评价推荐:
    根据用户的评价历史、学习偏好和背景信息,为用户提供个性化的评价推荐。例如,如果用户对某个讲师的课程评价较高,可以推荐该讲师的其他课程。
    允许用户选择与自己背景相似的评价进行查看,以便更好地了解课程是否适合自己。
    
    动态调整评价权重:
    根据课程的类型、目标受众和教学目标,动态调整不同评价指标的权重。例如,对于实践类课程,可以增加对实践环节和案例分析的评价权重。
    根据用户反馈和课程效果数据,定期更新评价权重,确保评价系统始终与课程目标和用户需求保持一致。
    
    增加互动性和参与感:
    鼓励用户在评价中分享具体的学习经历、收获和改进建议,以增加评价的深度和真实性。
    引入问答、讨论或投票等互动环节,让用户之间可以就课程内容和评价进行交流,提升评价的参与感和影响力。
    
    提供反馈渠道和持续优化:
    设立专门的反馈渠道,让用户可以随时向系统或管理员提供关于评价系统的改进建议。
    定期收集和分析用户反馈,根据反馈结果对评价系统进行持续优化和改进。
    
    结合外部数据源:
    如果可能的话,结合外部数据源(如行业动态、市场需求、竞争对手评价等)来优化评价系统。这有助于确保评价系统不仅反映用户的主观感受,还能与外部环境保持同步。
    
    透明度和公正性:
    确保评价系统的透明度和公正性,让用户了解评价标准和计算过程。这有助于建立用户对评价系统的信任感,并提高其接受度。
    通过实施上述优化策略,可以显著提升课程评价系统的智能化水平,使其更加符合用户的期望和需求。
    

五. 使用技巧

5.1 分步构建

在整个开发构建过程中,对每个执行步骤再拆解,不要试图一次性解决一堆问题.
要从主干到枝端,从框架到细节,分步构建的思路如下:

从主体到细节拆解:

  • 系统—>模块—>组件
  • 主干功能—>枝干功能—>功能细节—>异常校验
  • 整体布局—>主要交互—>样式细节

具备完整项目开发经验的人基本都会熟悉这套流程和思想,在与GPT协同开发时也是类似思路。我们需要通过循序渐进的提问方式,来引导GPT分步完成最终任务.

5.2 赋予GPT任务角色

假设你是一个非常有经验的程序开发者/领域专家,接下来我将向你提出关于xxxx的开发问题,请为我提供详细指导

这个步骤是必须的,是在所有提问开始之前的第一步,大模型的原理是通过概率推导生成与提示词相关的内容,“如果你没有跟它说「你是个领域专家」,它就会在低质量的推导中消耗较多的计算概率,反之,它就会丢弃更多低质量的分支逻辑,这样就可以确保更多的计算资源在预期的结果上了。”

5.3 跨会话发送更多代码信息

我现在运行xxxx应用之后始终无法启动xx后端服务,接下来,我将逐一发送你xx.js,xx.json,xx.py三个文件的代码以及文件所属路径,请在拿到这三份信息后,帮我全面分析一下问题可能出现的原因

当代码文件过长时,我们可以通过一个提示词技巧绕过单轮对话的发送词数限制:要求GPT等待多轮文本发送完毕之后再整体分析.

六. 总结

GPT作为一种强大的自然语言处理技术,能够在软件生命周期的各个阶段发挥重要作用,从而提高开发效率、优化产品质量,并帮助团队更好地应对复杂的软件开发挑战。
随着人工智能技术的进一步发展,GPT在软件工程领域的应用前景将更加广阔。

但是,如同当前汽车行业的辅助驾驶功能一样,只起到一个辅助的作用.
如果完全的信任他, 就相当于把自身的安全交给了冰冷的机器,这是一种对自己很不负责的态度GPT同理,在使用时一定要仔细验证,不能过于相信生成的结果.
否则后续出现问题导致的返工,将会比你使用它所节省的时间,要花的时间更长!

下图为GPT生成的思维导图
在这里插入图片描述


参考:
GPT4开发应用实践(全栈篇)
全球开发者用GPT4都在做什么?这28种方法值得一看
面向 ChatGPT 编程实现全栈开发的 18 种方法
ChatGPT:让你的开发工作更轻松

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时间静止不是简史

感谢你的肯定, 我将继续努力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值