news 2026/6/22 10:48:11

Postman接口测试实战:从零构建电商后台自动化测试工作流

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Postman接口测试实战:从零构建电商后台自动化测试工作流

1. 项目实战前的准备:从工具到思路

如果你已经跟着前面的教程,把Postman的界面、请求构建、变量和环境这些基础功能都摸了一遍,那恭喜你,你已经拿到了“驾照”。但光有驾照,没上过路,心里还是没底。这节实战,就是带你真正“上路”,去处理一个真实、完整的接口测试项目。我会用一个模拟的电商后台管理系统作为案例,把前面学到的所有知识点串起来,让你看到它们是如何在实际项目中协同工作的。

这个实战项目,我们不追求花哨的框架,就用最朴素的Postman功能,目标是解决测试工程师日常最头疼的几个问题:接口那么多,我怎么高效地组织和管理?测试数据怎么准备才不混乱?断言怎么写才能又快又准?一个接口依赖另一个接口的返回数据怎么办?这些痛点,我都会在实战中给出我的解决方案。你会发现,用好Postman的集合(Collection)、变量、测试脚本(Tests)和预请求脚本(Pre-request Script),即使面对几十上百个接口,测试工作也能变得井井有条。

在开始之前,我们需要明确这个实战项目的背景。我们假设要测试一个名为“ShopX”的电商平台后台管理系统,它提供了商品管理、订单管理、用户管理等模块的RESTful API。我们的任务是对这些接口进行功能测试。为了模拟真实环境,我会搭建一个简单的Mock Server(使用Postman自带的Mock功能或一个简单的本地服务)来提供稳定的测试接口,确保你能跟着步骤复现所有操作。

注意:实战中所有接口地址、参数均为示例。你需要根据自己实际测试的系统进行调整。核心是掌握方法和思路,而不是死记硬背这几个URL。

2. 项目结构与测试集合规划

面对一个全新的项目,一头扎进去就发请求是最低效的做法。好的开始是成功的一半,在Postman里,这个“开始”就是规划你的测试集合结构。

2.1 按业务模块创建集合与文件夹

我的习惯是按系统的业务模块来划分Postman集合。对于“ShopX”项目,我会先创建一个主集合,命名为ShopX_Backend_API_Test。然后,在这个集合下,创建对应的子文件夹(Folder)。

  1. 创建主集合:点击左侧边栏的“New”按钮,选择“Collection”。命名为ShopX_Backend_API_Test,描述可以写“电商后台管理系统全量接口测试”。
  2. 创建子文件夹:在新建的集合上右键,选择“Add Folder”。我会创建以下几个文件夹:
    • 01_Auth:认证相关接口,如登录、退出、刷新令牌。
    • 02_User_Management:用户管理接口,如查询用户列表、创建用户、修改用户信息。
    • 03_Product_Management:商品管理接口,如商品列表、商品详情、上架/下架商品。
    • 04_Order_Management:订单管理接口,如创建订单、查询订单、取消订单。
    • 05_Data_Setup:数据准备接口。这个文件夹很关键,里面放一些用于准备测试数据的请求,比如创建一个测试商品、注册一个测试用户。这些请求通常只在测试开始前运行一次。
    • 99_Common:公共资源。这里不放具体请求,而是放一些可能在多个地方用到的示例请求(通过“Save as example”保存),或者只是作为一个备注分区。

为什么这么分?这模拟了真实测试中的“测试套件”概念。Auth是几乎所有其他接口的前置条件(需要Token),所以放最前面。按业务分,查找和维护起来非常直观。Data_Setup独立出来,是为了避免污染正式的测试流程。

2.2 环境变量与全局变量设计

变量是Postman的灵魂,规划好变量能让你的测试脚本健壮且易于维护。我会为这个项目创建两个环境:ShopX_Dev(开发环境)和ShopX_Test(测试环境)。

ShopX_Dev环境中,我会预设以下变量:

  • base_url:https://dev-api.shopx.com/v1(基础URL)
  • admin_username:admin@test.com(管理员账号)
  • admin_password:Admin123456(管理员密码)
  • test_user_username:test_user@example.com(普通测试用户账号)
  • test_user_password:Test123456(普通测试用户密码)

ShopX_Test环境中,只需要把base_url的值改为测试环境的地址即可,其他账号密码可以相同(如果测试环境数据是隔离的,则也需要更换)。

此外,我还会设置一些全局变量,用于在运行时传递数据:

  • access_token: (用于存储登录后获取的令牌,初始为空)
  • current_user_id: (用于存储当前操作的用户ID)
  • created_product_id: (用于存储新创建的商品ID)
  • created_order_id: (用于存储新创建的订单ID)

这些全局变量的值不会手动填写,而是通过脚本在测试过程中自动获取并更新。这样,A接口的产出,就能成为B接口的入参。

实操心得:base_url这类和环境强相关的配置,一定要放在环境变量里。而像access_token这种在单次测试会话中动态变化、且需要跨接口共享的值,放在全局变量里最合适。清晰地区分环境变量和全局变量的用途,是写出可维护测试脚本的第一步。

3. 认证流程测试:获取并传递Token

几乎所有需要权限的接口都离不开认证。我们首先实现登录接口测试,并解决Token的自动获取与传递问题。

3.1 编写登录接口请求

01_Auth文件夹下,新建一个请求,命名为Login - Admin

  • 方法POST
  • URL{{base_url}}/auth/login(使用环境变量)
  • Body:选择raw->JSON,填入以下内容:
    { "username": "{{admin_username}}", "password": "{{admin_password}}" }
    这里我们直接引用了环境变量中的账号密码。

点击“Send”发送请求。假设Mock Server返回的成功响应如下:

{ "code": 200, "message": "success", "data": { "user_id": 1, "username": "admin@test.com", "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "expires_in": 7200 } }

3.2 使用Tests脚本自动提取并存储Token

手动复制Token再粘贴到其他请求的Header里太原始了。我们要让Postman自动完成这件事。在Login - Admin请求的“Tests”标签页中,编写以下JavaScript代码:

// 1. 检查响应状态码是否为200 pm.test("Status code is 200", function () { pm.response.to.have.status(200); }); // 2. 检查响应体包含success消息 pm.test("Response has success message", function () { var jsonData = pm.response.json(); pm.expect(jsonData.message).to.eql("success"); }); // 3. 从响应JSON中提取access_token和user_id,并设置为全局变量 var jsonData = pm.response.json(); if (jsonData && jsonData.data) { // 提取并设置access_token var accessToken = jsonData.data.access_token; pm.globals.set("access_token", accessToken); console.log("Access token set: " + accessToken); // 提取并设置user_id var userId = jsonData.data.user_id; pm.globals.set("current_user_id", userId); console.log("User ID set: " + userId); // 可选:你也可以把token存到当前环境变量中,看个人习惯 // pm.environment.set("access_token", accessToken); }

这段代码做了三件事:1) 断言响应状态;2) 断言业务状态;3)最关键的一步,解析响应JSON,将access_tokenuser_id的值设置到全局变量中。

发送请求后,打开Postman右上角的“眼睛”图标(环境快速查看),选择“Globals”,你应该能看到access_tokencurrent_user_id已经被更新为最新的值。

3.3 配置集合级认证,实现Token自动传递

现在Token已经存为全局变量了,难道每个需要认证的请求都要手动加Header吗?不用。Postman提供了集合级(或文件夹级)的认证配置,可以一劳永逸。

  1. 点击顶层的ShopX_Backend_API_Test集合右侧的“...”按钮,选择“Edit”。
  2. 在编辑窗口中找到“Authorization”选项卡。
  3. Type选择Bearer Token
  4. Token字段填入{{access_token}}

这样配置后,该集合下的所有请求(除非子文件夹或单个请求覆盖了此配置)都会自动在Header中添加:Authorization: Bearer <你的token值>。这就是“继承”机制的好处。

注意事项:集合级认证非常方便,但要小心。如果你的测试用例里包含“使用错误Token访问”这种负面测试,这个请求就必须在自身的“Authorization”选项卡里选择“Inherit auth from parent”为“No”,然后手动设置一个错误的Token,否则它会自动使用正确的全局Token,导致测试用例失效。时刻清楚你的配置在哪个层级生效。

4. 用户管理模块测试:参数化与数据驱动

接下来测试用户管理模块。这里我们会遇到两个典型场景:查询用户列表(带参数)和创建新用户(需要动态测试数据)。

4.1 查询用户列表:使用Query Params与环境变量

02_User_Management文件夹下,新建请求Get User List

  • 方法GET
  • URL{{base_url}}/users
  • Params:在“Params”标签页下,添加以下查询参数:
    • page:1
    • pageSize:10
    • username:{{test_user_username}}(这里引用环境变量,实现按特定用户名搜索)

这个请求会自动继承集合的Bearer Token认证。发送请求,检查返回的用户列表数据是否符合预期。你可以在“Tests”里添加断言,比如检查返回的data是一个数组,并且数组长度不大于pageSize

4.2 创建新用户:动态生成测试数据与响应断言

创建用户接口是POST请求,需要提供用户信息。硬编码数据会导致多次运行失败(用户已存在)。我们需要动态生成数据。

02_User_Management文件夹下,新建请求Create User - Dynamic

1. 使用Pre-request Script生成动态数据:在“Pre-request Script”标签页中,编写脚本生成随机的用户名和邮箱:

// 生成一个时间戳,用于确保唯一性 var timestamp = new Date().getTime(); // 生成随机用户名和邮箱 var dynamicUsername = `autotest_user_${timestamp}`; var dynamicEmail = `autotest_${timestamp}@example.com`; // 将动态生成的数据设置为局部变量(仅本次请求可用)或环境变量 // 这里我们设置为局部变量,方便在请求Body中引用 pm.variables.set("dynamic_username", dynamicUsername); pm.variables.set("dynamic_email", dynamicEmail); console.log(`Generated username: ${dynamicUsername}`); console.log(`Generated email: ${dynamicEmail}`);

2. 配置请求Body:

  • 方法POST
  • URL{{base_url}}/users
  • Body:选择raw->JSON,使用刚才生成的变量:
    { "username": "{{dynamic_username}}", "email": "{{dynamic_email}}", "password": "Test123456", "role": "customer" }

3. 编写全面的Tests断言:在“Tests”标签页中,我们不仅要检查状态码,还要验证返回的业务数据是否正确,并且将新创建的用户ID保存下来,供后续测试使用(比如查询、修改这个用户)。

// 1. 基础状态断言 pm.test("Create User - Status 201", function () { pm.response.to.have.status(201); // 通常创建成功返回201 }); // 2. 解析响应JSON var jsonData = pm.response.json(); // 3. 业务状态断言 pm.test("Response code is 200", function () { pm.expect(jsonData.code).to.eql(200); }); // 4. 响应数据验证:检查返回的用户信息包含我们发送的数据 pm.test("Response contains created user info", function () { pm.expect(jsonData.data).to.be.an('object'); pm.expect(jsonData.data.username).to.eql(pm.variables.get("dynamic_username")); pm.expect(jsonData.data.email).to.eql(pm.variables.get("dynamic_email")); pm.expect(jsonData.data.role).to.eql("customer"); // 确保返回了用户ID pm.expect(jsonData.data.id).to.be.a('number').and.to.be.above(0); }); // 5. 将新创建的用户ID保存为全局变量,供后续“查询特定用户”、“修改用户”等请求使用 if (jsonData.data && jsonData.data.id) { var newUserId = jsonData.data.id; pm.globals.set("newly_created_user_id", newUserId); console.log("New user ID saved globally: " + newUserId); }

这样,每次运行这个请求,都会创建一个用户名和邮箱唯一的新用户,并且将其ID自动存储,整个流程无需任何手动干预。这就是自动化测试的雏形。

4.3 使用Collection Runner进行数据驱动测试

如果我们想用多组不同的数据(比如不同的角色、不同的无效密码)来测试创建用户接口呢?手动改请求体太麻烦。我们可以用Collection Runner配合数据文件来实现。

  1. 准备一个CSV或JSON数据文件。例如,创建一个user_data.csv

    username,email,password,role,expected_status,expected_message user1,user1@test.com,Pass123,customer,201,success user2,user2@test.com,short,staff,400,Password too short admin_user,admin@test.com,Admin123,admin,403,Permission denied

    第一行是变量名,后面是数据行。

  2. 修改Create User - Dynamic请求:将Body中的硬编码值替换为CSV文件中的变量名。注意,Pre-request Script中动态生成的部分需要注释掉,因为数据将由文件提供。

    { "username": "{{username}}", "email": "{{email}}", "password": "{{password}}", "role": "{{role}}" }
  3. 修改Tests脚本:断言部分也要使用数据文件中的变量。

    // 从数据文件中读取预期的状态码和消息 var expectedStatus = parseInt(pm.iterationData.get("expected_status")); var expectedMessage = pm.iterationData.get("expected_message"); pm.test(`Status is ${expectedStatus}`, function () { pm.response.to.have.status(expectedStatus); }); pm.test(`Message contains "${expectedMessage}"`, function () { var jsonData = pm.response.json(); pm.expect(jsonData.message).to.include(expectedMessage); });
  4. 运行Collection Runner

    • 在Postman左侧边栏,右键点击02_User_Management文件夹或整个集合,选择“Run collection”。
    • 在Runner界面,点击“Select File”上传你的user_data.csv
    • Postman会为数据文件的每一行(每次迭代)运行一次选中的请求。
    • 在结果中,你可以清晰地看到每次迭代的断言结果,成功或失败一目了然。

数据驱动测试能极大提高测试用例的覆盖率和维护效率,特别适合参数校验、边界值测试等场景。

5. 商品与订单模块测试:工作流与链式调用

电商系统的核心业务流程往往是链式的:创建商品 -> 创建订单 -> 支付订单 -> 查询订单。在API测试中,我们需要模拟这个工作流,并且让数据在接口间流动。

5.1 创建测试商品(数据准备)

首先,在05_Data_Setup文件夹下创建一个请求Setup - Create Test Product。这个请求的目的是为后续的订单测试准备一个可用的商品。

  • 方法POST
  • URL{{base_url}}/products
  • Body:生成一个唯一的测试商品。
    { "name": "AutoTest Product " + new Date().getTime(), "price": 99.9, "stock": 100, "description": "This is a product created for automated order testing." }
  • Tests脚本:关键是将创建成功的商品ID保存到全局变量。
    pm.test("Product created successfully", function () { pm.response.to.have.status(201); var jsonData = pm.response.json(); pm.expect(jsonData.code).to.eql(200); var productId = jsonData.data.id; pm.globals.set("test_product_id", productId); pm.globals.set("test_product_price", jsonData.data.price); console.log(`Test product ID saved: ${productId}`); });

5.2 创建订单:引用前置数据

现在,进入04_Order_Management文件夹,创建请求Create Order

  • 方法POST

  • URL{{base_url}}/orders

  • Body:使用前面保存的全局变量来构建请求体。这里假设创建订单需要商品ID和购买数量。

    { "user_id": {{current_user_id}}, "items": [ { "product_id": {{test_product_id}}, "quantity": 2 } ] }

    注意,user_id来自登录后设置的current_user_idproduct_id来自上一步数据准备请求设置的test_product_id。这就是链式调用。

  • Tests脚本:除了常规断言,必须保存订单ID。

    pm.test("Order created", function () { pm.response.to.have.status(201); var jsonData = pm.response.json(); var orderId = jsonData.data.order_id; pm.globals.set("created_order_id", orderId); // 可以做一个简单的业务逻辑断言:计算订单总价是否正确 var expectedTotal = pm.globals.get("test_product_price") * 2; pm.expect(jsonData.data.total_amount).to.eql(expectedTotal); console.log(`Order created with ID: ${orderId}, Total: ${expectedTotal}`); });

5.3 查询与验证订单

创建订单后,自然需要查询验证。创建请求Get Order Detail

  • 方法GET
  • URL{{base_url}}/orders/{{created_order_id}}(URL路径中直接引用订单ID变量)

这个请求的Tests脚本,就可以详细验证订单的每一个字段是否与创建时一致,包括用户信息、商品信息、金额、状态等。这就是一个完整的工作流测试。

实操心得:在编写链式调用的测试时,务必考虑测试的独立性和可重复性。比如,在每次完整运行工作流前,最好能先清理可能残留的测试数据(如之前创建的测试订单)。这可以通过在05_Data_Setup文件夹下再添加一个“清理”请求来实现,或者使用Newman(Postman的命令行工具)配合--folder参数来控制执行顺序。确保你的测试脚本不会因为脏数据而失败。

6. 集合运行与测试报告生成

单个请求测试通过,不代表整个业务流程没问题。我们需要批量运行一个完整的工作流,并生成清晰的测试报告。

6.1 使用Collection Runner组织测试流程

Collection Runner不仅可以做数据驱动测试,更是组织用例执行顺序的利器。

  1. 规划执行顺序:我们通常希望按“数据准备 -> 核心业务流 -> 数据清理”的顺序执行。在Collection Runner界面,你可以通过拖拽来调整请求的顺序。例如:

    • Data_Setup文件夹下的请求(如创建测试商品、测试用户)。
    • Auth文件夹下的Login请求(获取Token)。
    • Order_Management文件夹下的Create Order,Get Order Detail等请求。
    • (可选)Data_Setup文件夹下的清理请求。
  2. 配置运行选项

    • Delay:可以设置请求间隔,避免对服务器造成瞬时压力。
    • Data File:如果需要数据驱动,在这里上传文件。
    • Environment:选择你要运行的环境(如ShopX_Dev)。
    • Iterations:设置整个集合要运行的次数。
  3. 点击“Run”:Postman会按顺序执行所有选中的请求,并在右侧显示实时结果。绿色对勾表示断言通过,红色叉号表示失败。点击每个请求可以查看详细的请求和响应信息,以及Tests脚本中console.log的输出,这对于调试至关重要。

6.2 Newman:命令行集成与持续集成

Postman的图形化界面适合调试和手动执行,但真正的自动化测试需要集成到CI/CD流水线中(如Jenkins、GitLab CI)。这就需要Newman

Newman是Postman的命令行集合运行器。你需要先导出你的集合和环境。

  1. 导出集合与环境

    • 在集合上点击“...”,选择“Export”,导出为Collection v2.1格式的JSON文件(例如ShopX_Collection.json)。
    • 在环境切换下拉框旁点击“眼睛”图标,选择环境后点击“Edit”,在环境编辑界面点击“Export”,导出环境文件(例如ShopX_Dev_Environment.json)。
  2. 安装与运行Newman(需要Node.js环境):

    # 全局安装Newman npm install -g newman # 最基本运行命令 newman run ShopX_Collection.json -e ShopX_Dev_Environment.json # 生成HTML报告(需要安装reporter) npm install -g newman-reporter-html newman run ShopX_Collection.json -e ShopX_Dev_Environment.json -r html --reporter-html-export report.html
  3. 解读Newman报告:生成的HTML报告会清晰展示整个运行的概况、每个迭代的结果、每个请求的断言状态、甚至包含请求和响应的详细数据。测试失败时,报告能快速定位问题所在。

将Newman命令写入CI的脚本(如Jenkinsfile或.gitlab-ci.yml),每次代码提交后自动运行接口测试并生成报告,就实现了接口测试的持续集成。这是现代软件工程中保证质量的关键一环。

7. 常见问题与调试技巧实录

在实际操作中,你一定会遇到各种问题。下面是我踩过的一些坑和总结的技巧。

7.1 变量未定义或值为空

这是最常见的问题。错误信息通常是There was an error in evaluating the test script: ReferenceError: variable_name is not defined或者请求发送时变量没有被替换(显示为{{variable}})。

  • 排查步骤
    1. 检查变量作用域:你是在哪里设置的变量(Globals, Environment, Collection, Local)?又在哪个作用域下引用的?确保引用作用域≥设置作用域。比如,在Pre-request Script中用pm.variables.set设置的是局部变量,只能在当前请求内引用。
    2. 检查执行顺序:如果你在请求A的Tests脚本里设置了一个全局变量,然后在同一个Collection Run中紧接着的请求B里使用它,这通常是没问题的。但如果你手动单独运行请求B,这个全局变量可能还未被设置。确保依赖数据的请求在其数据源请求成功执行后才运行。
    3. 打印变量值:在Pre-request Script或Tests脚本中使用console.log(pm.variables.get(“variable_name”))console.log(pm.globals.get(“variable_name”))来输出变量当前的值,这是最直接的调试手段。

7.2 异步操作导致变量设置不及时

在Tests脚本中,pm.globals.set是同步的,一般没问题。但如果你在脚本中发起了异步请求(比如用pm.sendRequest),然后在回调函数里设置变量,就要小心了。下一个请求可能在你设置完变量之前就开始执行了。

  • 解决方案:如果测试流程依赖异步操作的结果,最好将这些步骤合并到一个请求的Tests脚本中完成,或者使用Postman的setNextRequest()函数来控制执行流程,确保异步操作完成后再进入下一步。

7.3 复杂断言与JSON数据提取

当响应JSON结构非常复杂(深层次嵌套、动态数组)时,编写断言会很头疼。

  • 技巧:使用pm.expect的链式调用和jsonPath
    var jsonData = pm.response.json(); // 检查data下有一个orders数组,且数组第一个元素的status为"paid" pm.expect(jsonData).to.have.nested.property('data.orders[0].status').that.equals('paid'); // 使用jsonPath查找所有价格大于100的商品ID var expensiveProductIds = pm.jsonPath.query(jsonData, "$.data.products[?(@.price > 100)].id"); pm.expect(expensiveProductIds).to.be.an('array').that.is.not.empty;
    Postman内置了Chai断言库和JSONPath支持,功能非常强大,多查文档多练习。

7.4 请求超时或性能问题

在Runner中批量运行测试时,可能会遇到请求超时。

  • 调整设置:在集合Runner的设置中,可以增加“Request timeout (ms)”。但更重要的是,要区分是测试工具问题还是被测系统问题。
  • 使用setTimeout:在Pre-request Script中,对于依赖某些慢速前置条件的场景,可以简单用setTimeout做延迟,但这只是权宜之计。
  • 监控与日志:查看Postman Console(View -> Show Postman Console)的详细网络日志,看时间消耗在哪个环节。同时,确保你的Mock Server或真实服务性能正常。

7.5 身份认证失效

Token过期会导致后续请求全部失败。

  • 实现Token自动刷新:在Tests脚本中,不仅检查状态码为200,还要检查业务码。如果遇到401或特定的token_expired错误码,可以自动触发一个刷新Token的请求(如果系统提供刷新接口),然后用新的Token更新全局变量。这需要更复杂的脚本逻辑,通常放在集合级别的“Tests”中,对所有请求响应进行检查处理。

我个人的体会是,Postman接口测试项目实战,核心不在于记住每一个按钮的位置,而在于建立起“以集合和变量为核心,以脚本为驱动”的测试组织思维。把零散的接口通过数据和逻辑串联成有意义的业务流测试,并能稳定、自动地运行,这才是从“会用工具”到“做好测试”的关键一步。当你看着Collection Runner里一排绿色的对勾,或者CI流水线上自动生成的测试报告时,那种对系统质量的掌控感,是非常实在的。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/22 10:47:47

Seedance 2.0:多模态混合输入驱动的AI视频生成新范式

1. 项目概述&#xff1a;这不是又一个“AI视频玩具”&#xff0c;而是一套可落地的视觉内容生产新范式Seedance 2.0 这个名字最近在内容创作圈里炸开了锅&#xff0c;但很多人点开页面后第一反应是&#xff1a;“这玩意儿到底能干啥&#xff1f;和我之前用过的那些‘AI生成视频…

作者头像 李华
网站建设 2026/6/22 10:46:39

嵌入式音频接口SAI:从I2S到TDM的配置与实战

1. SAI模块&#xff1a;嵌入式音频处理的基石 在嵌入式音频应用里&#xff0c;无论是车载信息娱乐系统播放音乐&#xff0c;还是工业设备发出提示音&#xff0c;数字音频数据都需要在处理器和编解码器&#xff08;Codec&#xff09;之间可靠地传输。这时候&#xff0c;一个专用…

作者头像 李华
网站建设 2026/6/22 10:44:20

5分钟上手Mermaid Live Editor:免费实时图表编辑器的终极指南

5分钟上手Mermaid Live Editor&#xff1a;免费实时图表编辑器的终极指南 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live…

作者头像 李华
网站建设 2026/6/22 10:37:50

3分钟终极指南:免费解锁WeMod完整Pro功能

3分钟终极指南&#xff1a;免费解锁WeMod完整Pro功能 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 还在为游戏修改器的高级功能付费而烦恼吗&#xff…

作者头像 李华
网站建设 2026/6/22 10:36:10

学生考勤管理系统-python+Django

本项目为前几天收费帮学妹做的一个项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述基于pythonDjango学生考勤管理系统通过SQLite数据库连接数据库 http://127.0.0.1:181…

作者头像 李华