简介:本资源是一套基于Python Django框架与MySQL数据库开发的银行信贷管理系统毕业设计源码,面向计算机专业本科生及Web开发初学者,适用于课程设计、毕业设计实践与全栈开发能力训练。系统涵盖用户管理、贷款申请、审批流程、信用评估、还款计划等核心模块,代码结构清晰,具备完整前后端交互与数据库操作逻辑。压缩包共2687个文件,含44个Python后端脚本、293个HTML页面、1650个JavaScript交互逻辑、246个CSS样式文件及多种静态资源(PNG/GIF/JPG/SQL等),整体体积5.66MB,轻量易部署。已有236人学习下载,所有源码均经本地编译验证可运行,配套详细环境配置文档与助教审定说明,便于快速上手调试、理解Django MTV架构与MySQL表设计实践,是掌握企业级金融类Web应用开发的典型教学案例。
1. 这不是又一个“学生管理系统”:Django+MySQL银行信贷系统源码包,真能跑通风控流程、支持多角色审批、带真实字段校验逻辑
你下载过几十个标着“Python毕业设计”的.zip包,解压后发现:首页是黑底白字的“欢迎使用”,数据库只有user和admin两张表,连个贷款申请按钮都点不动——这次不一样。这个名为Python基于Django+mysql银行信贷管理系统设计毕业源码案例设计.zip的资源,是少数几个把银行信贷业务链路真正落地到代码层的实战型源码包:它包含完整的客户信息录入(含身份证OCR校验模拟)、授信额度计算(基于收入/负债比公式)、多级审批流(客户经理→风控专员→主管三级驳回/通过)、放款与还款计划生成(支持等额本息/等额本金自动计算),且所有模型字段均按《商业银行授信工作尽职指引》做了非空、长度、数值范围约束(比如年收入必须>5000且<99999999)。它不教你怎么装Python,而是默认你已配好Django 3.2 + MySQL 5.7+环境;它不讲ORM基础,直接在models.py里用DecimalField(max_digits=12, decimal_places=2)存金额、用JSONField存还款计划明细。适合两类人:一是正在赶毕设答辩、需要可演示+可解释业务逻辑的计算机/信管专业学生;二是想快速复现信贷MVP原型的中小金融机构IT岗——别被“毕业设计”四个字骗了,它的表结构设计和状态机流转,比某些外包公司交付的初版还扎实。
2. 从零启动:5步跑通系统,重点看这3个配置文件怎么改
2.1 环境准备:只装这4个包,别碰pip install django==4.x
这个源码包基于Django 3.2.23(LTS长期支持版)开发,与Django 4.x的path()路由语法、as_view()参数签名有兼容性断裂。强行升级会导致urls.py报错TypeError: as_view() got an unexpected keyword argument 'name'。所以第一步必须锁定版本:
pip install django==3.2.23 mysqlclient==2.1.1 pytz==2023.3 pillow==9.5.0提示:
mysqlclient是Python连接MySQL的C扩展,比pymysql性能高3倍以上,且本项目settings.py中明确写了'ENGINE': 'django.db.backends.mysql',必须用它。Windows用户若编译失败,请先安装 Microsoft Visual Studio Build Tools ,再执行pip install mysqlclient。
2.2 数据库初始化:建库、授权、导入初始数据三连击
源码包里的db_init.sql不是空壳脚本——它包含6张核心表:credit_customer(客户基本信息)、credit_application(贷款申请单)、credit_approval_flow(审批节点记录)、credit_loan_contract(合同文本存base64)、credit_repayment_schedule(还款计划明细)、credit_user_role(角色权限映射)。执行前需手动创建数据库并授权:
-- 在MySQL命令行执行(假设用户名root,密码123456) CREATE DATABASE credit_system DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'credit_app'@'localhost' IDENTIFIED BY 'cred1tP@ss2024'; GRANT ALL PRIVILEGES ON credit_system.* TO 'credit_app'@'localhost'; FLUSH PRIVILEGES;然后导入SQL:
mysql -u credit_app -pcred1tP@ss2024 credit_system < db_init.sql2.3 Django配置:settings.py里这4处不改,绝对连不上库
打开credit_system/settings.py,找到以下关键位置并修改(原文件用占位符YOUR_XXX标记):
# 2.3.1 数据库配置(第92行附近) DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'credit_system', # 必须与你创建的库名一致 'USER': 'credit_app', # 必须与授权用户名一致 'PASSWORD': 'cred1tP@ss2024', # 必须与授权密码一致 'HOST': '127.0.0.1', # 不要写localhost,Windows下可能解析失败 'PORT': '3306', 'OPTIONS': { 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'", 'charset': 'utf8mb4', }, } } # 2.3.2 静态文件路径(第142行) STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') # 注意:不是static/ # 后续collectstatic会把所有static目录合并到这里 # 2.3.3 调试开关(第27行) DEBUG = True # 毕设演示必须开True,否则404不显示错误详情 # 2.3.4 密钥(第22行) SECRET_KEY = 'django-insecure-8vz^jxkq0y5f!l3m7n9p2r4t6w8y0a2c4e6g8i0k2m4o6q8s0u2w4y6' # 可保留,但上线必须换2.4 迁移与启动:两条命令验证是否真通
完成配置后,在项目根目录(含manage.py的目录)执行:
# 生成迁移文件(检查models.py是否被正确识别) python manage.py makemigrations # 执行迁移(此时会向credit_system库写入表结构) python manage.py migrate # 创建超级管理员(用于登录后台) python manage.py createsuperuser # 启动服务(默认端口8000) python manage.py runserver访问http://127.0.0.1:8000/admin/输入刚创建的账号,应看到Django Admin界面,且左侧菜单栏出现Credit分组下的6个模型——说明数据库连通、模型注册成功。再访问http://127.0.0.1:8000/,首页应显示“银行信贷管理系统”标题及客户申请入口。
2.5 用户角色初始化:为什么admin登录后看不到“审批”按钮?
源码包未内置角色数据,需手动插入初始角色。进入Django Shell执行:
python manage.py shell# 在shell中执行以下Python代码 from django.contrib.auth.models import User from credit.models import UserRole # 注意:app名是credit,不是credit_system # 为superuser分配角色 admin_user = User.objects.get(username='your_admin_username') UserRole.objects.create( user=admin_user, role_name='风控主管', permissions=['can_approve_all', 'can_view_report'] ) # 再创建两个测试用户(客户经理、风控专员) from django.contrib.auth.models import User User.objects.create_user('manager001', 'manager@example.com', 'Mgr@123456') User.objects.create_user('risk001', 'risk@example.com', 'Risk@123456') # 分配角色 mgr = User.objects.get(username='manager001') UserRole.objects.create( user=mgr, role_name='客户经理', permissions=['can_submit_application', 'can_view_own_applications'] ) risk = User.objects.get(username='risk001') UserRole.objects.create( user=risk, role_name='风控专员', permissions=['can_review_application', 'can_reject_application'] )逻辑说明:
UserRole模型是本项目自定义的角色权限中间表,permissions字段存JSON数组。前端模板templates/credit/base.html中通过{% if 'can_approve_all' in user.userrole.permissions %}控制按钮显示,因此不插这条数据,admin登录后永远看不到“全局审批”入口。
3. 核心业务跑通:客户申请→风控审核→合同生成,三步实操链路
3.1 客户申请:表单校验不是摆设,身份证号、手机号、收入字段全有正则约束
访问http://127.0.0.1:8000/apply/进入申请页。注意三个关键校验点:
- 身份证号:前端用
/^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$/校验18位,后端models.py中id_card = models.CharField(max_length=18, validators=[validate_id_card])调用自定义函数validate_id_card()做校验码计算; - 手机号:
phone = models.CharField(max_length=11, validators=[validate_phone_number]),正则^1[3-9]\d{9}$; - 年收入:
annual_income = models.DecimalField(max_digits=12, decimal_places=2, validators=[MinValueValidator(5000), MaxValueValidator(99999999)])。
提交后,数据存入credit_application表,状态为pending(待审核),并触发signals.py中的create_approval_flow信号,自动生成三条审批记录(客户经理→风控专员→主管),状态均为pending。
3.2 风控审核:审批页面如何区分角色权限?看views.py里的get_queryset重写
登录manager001账号(密码Mgr@123456),访问http://127.0.0.1:8000/approval/。此时看到的仅是自己提交的申请(status='pending' and applicant=user)。而risk001登录后,看到的是所有status='pending' and current_approver='risk001'的申请。这是因为在credit/views.py的ApprovalListView中:
# credit/views.py 第45行 def get_queryset(self): user = self.request.user try: role = user.userrole.role_name except AttributeError: return CreditApplication.objects.none() if role == '客户经理': return CreditApplication.objects.filter(applicant=user, status='pending') elif role == '风控专员': return CreditApplication.objects.filter( current_approver=user.username, status='pending' ) elif role == '风控主管': return CreditApplication.objects.filter(status='pending') return CreditApplication.objects.none()参数说明:
current_approver字段在credit_application表中存储当前待审批人用户名,由信号自动更新。get_queryset根据角色动态过滤,避免越权查看。
3.3 合同生成:还款计划怎么算?看calculate_repayment_schedule()函数
当主管审批通过后,系统调用credit/utils.py中的generate_loan_contract()函数,其中关键步骤是计算还款计划:
# credit/utils.py 第87行 def calculate_repayment_schedule(principal, annual_rate, months, repayment_type='equal_principal'): """ principal: 贷款本金(Decimal) annual_rate: 年化利率(如0.085表示8.5%) months: 还款月数(int) repayment_type: 'equal_principal' 或 'equal_payment' """ monthly_rate = annual_rate / 12 schedule = [] if repayment_type == 'equal_payment': # 等额本息 monthly_payment = float(principal) * (monthly_rate * (1 + monthly_rate) ** months) / ((1 + monthly_rate) ** months - 1) remaining_principal = float(principal) for month in range(1, months + 1): interest = remaining_principal * monthly_rate principal_payment = monthly_payment - interest remaining_principal -= principal_payment schedule.append({ 'month': month, 'principal_payment': round(principal_payment, 2), 'interest_payment': round(interest, 2), 'total_payment': round(monthly_payment, 2), 'remaining_principal': round(remaining_principal, 2) }) elif repayment_type == 'equal_principal': # 等额本金 monthly_principal = float(principal) / months remaining_principal = float(principal) for month in range(1, months + 1): interest = remaining_principal * monthly_rate total_payment = monthly_principal + interest remaining_principal -= monthly_principal schedule.append({ 'month': month, 'principal_payment': round(monthly_principal, 2), 'interest_payment': round(interest, 2), 'total_payment': round(total_payment, 2), 'remaining_principal': round(remaining_principal, 2) }) return schedule逻辑说明:该函数返回JSON列表,存入
credit_loan_contract.repayment_schedule字段(JSONField)。前端templates/credit/contract_detail.html用{{ contract.repayment_schedule|json_script:"repayment-data" }}渲染,再用JavaScript绘制还款计划表格。注意:float(principal)转换是为避免Decimal与**运算冲突,这是Django ORM处理金融计算的常见妥协。
3.4 合同PDF生成:xhtml2pdf不是噱头,真能导出带公章的PDF
点击“生成合同”按钮,调用credit/views.py中的ContractGenerateView,其核心是:
# credit/views.py 第128行 def generate_pdf(self, context): template = get_template('credit/contract_pdf.html') html = template.render(context) result = BytesIO() pdf = pisa.pisaDocument( BytesIO(html.encode("UTF-8")), result, encoding='UTF-8', link_callback=self.link_callback ) if not pdf.err: return HttpResponse(result.getvalue(), content_type='application/pdf') return HttpResponse('PDF generation error')contract_pdf.html中嵌入了<img src="{{ STATIC_URL }}images/seal.png">,源码包static/images/seal.png提供了一个红色圆形公章图片。生成的PDF包含:客户信息、贷款条款、还款计划表格、电子签章占位区——虽无CA认证,但结构符合银行合同基本要素。
3.5 报表导出:Excel不是截图,是openpyxl真写入
访问http://127.0.0.1:8000/report/,点击“导出本月放款报表”,触发credit/views.py中的ExportReportView:
# credit/views.py 第189行 def export_excel(self, queryset): wb = Workbook() ws = wb.active ws.title = "放款报表" # 表头 headers = ['申请编号', '客户姓名', '身份证号', '贷款金额', '年利率', '期限(月)', '放款日期', '状态'] for col_num, header in enumerate(headers, 1): cell = ws.cell(row=1, column=col_num, value=header) cell.font = Font(bold=True) cell.alignment = Alignment(horizontal='center') # 数据行 for row_num, app in enumerate(queryset, 2): ws.cell(row=row_num, column=1, value=app.application_id) ws.cell(row=row_num, column=2, value=app.customer.name) ws.cell(row=row_num, column=3, value=app.customer.id_card) ws.cell(row=row_num, column=4, value=float(app.loan_amount)) ws.cell(row=row_num, column=5, value=f"{app.annual_rate*100:.2f}%") ws.cell(row=row_num, column=6, value=app.loan_term) ws.cell(row=row_num, column=7, value=app.disbursement_date.strftime('%Y-%m-%d') if app.disbursement_date else '') ws.cell(row=row_num, column=8, value=app.get_status_display()) # 自动列宽 for column in ws.columns: max_length = 0 column_letter = column[0].column_letter for cell in column: try: if len(str(cell.value)) > max_length: max_length = len(str(cell.value)) except: pass adjusted_width = min(max_length + 2, 50) ws.column_dimensions[column_letter].width = adjusted_width response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') response['Content-Disposition'] = 'attachment; filename=loan_report.xlsx' wb.save(response) return response参数说明:
openpyxl直接操作Excel单元格,ws.cell()逐个写入,get_status_display()调用模型STATUS_CHOICES的中文描述。导出的Excel可被WPS/Excel直接打开,数字列自动右对齐,日期列格式正确——不是简单csv.writer,而是真·Excel对象操作。
4. 避坑指南:这5个问题90%的人第一次跑都会卡住,血泪经验总结
4.1 现象:python manage.py runserver报错ModuleNotFoundError: No module named 'mysqlclient'
原因:mysqlclient依赖MySQL C库,在Linux/macOS需先装libmysqlclient-dev(Ubuntu)或mysql-client(macOS),Windows需Visual Studio Build Tools。单纯pip install mysqlclient大概率失败。
解决:
- Ubuntu:
sudo apt-get install libmysqlclient-dev python3-dev,再pip install mysqlclient - macOS:
brew install mysql-client,再export PATH="/opt/homebrew/opt/mysql-client/bin:$PATH",再pip install mysqlclient - Windows:下载 Microsoft Visual Studio Build Tools ,勾选“C++ build tools”,重启终端再
pip install mysqlclient
4.2 现象:访问首页报错OperationalError at / Unknown database 'credit_system'
原因:settings.py中DATABASES['default']['NAME']写的库名与MySQL实际创建的库名不一致,或MySQL服务未启动。
解决:
- 先确认MySQL服务运行:
sudo service mysql status(Linux)或任务管理器看mysqld.exe进程(Windows) - 登录MySQL:
mysql -u root -p,执行SHOW DATABASES;,确认存在credit_system - 若不存在,执行
CREATE DATABASE credit_system DEFAULT CHARACTER SET utf8mb4; - 检查
settings.py中NAME值是否拼写错误(如credit-system误写为credit_system)
4.3 现象:Admin后台能看到表,但http://127.0.0.1:8000/apply/报错Reverse for 'apply' not found
原因:URL命名空间未正确声明。源码包credit/urls.py中app_name = 'credit',但主urls.py未用include()加载,或加载时未加namespace='credit'。
解决:
- 检查主
urls.py(credit_system/urls.py)中是否有:from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('', include('credit.urls', namespace='credit')), # 必须有namespace ] - 检查
credit/urls.py中app_name = 'credit'是否存在(第3行) - 模板中链接必须用
{% url 'credit:apply' %},不能写{% url 'apply' %}
4.4 现象:客户提交申请后,审批流卡在“客户经理”节点,credit_approval_flow表里current_approver为空
原因:signals.py中create_approval_flow信号未被触发,通常因apps.py未启用AppConfig。
解决:
- 打开
credit/apps.py,确认有:from django.apps import AppConfig class CreditConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'credit' def ready(self): import credit.signals # 必须导入signals模块 - 打开
credit/__init__.py,确认有:default_app_config = 'credit.apps.CreditConfig' - 若用Django 3.2+,可删掉
default_app_config,改在settings.py的INSTALLED_APPS中写'credit.apps.CreditConfig'
4.5 现象:生成PDF时报错UnicodeEncodeError: 'latin-1' codec can't encode characters
原因:xhtml2pdf默认编码为latin-1,但中文HTML需UTF-8。pisa.pisaDocument()参数未指定encoding。
解决:
- 确认
credit/views.py中pisa.pisaDocument()调用时有encoding='UTF-8'参数(见3.4节代码) - 检查
contract_pdf.html顶部是否有<meta charset="UTF-8"> - 若仍报错,在
settings.py中添加:import os os.environ['PYTHONIOENCODING'] = 'utf-8'
5. 进阶技巧:用Django Shell批量造100条测试数据,3分钟搞定压力测试基线
5.1 为什么必须用Shell造数据?而不是手点100次表单?
手工提交100次申请,耗时且不可控:无法精确设置不同状态(pending/approved/rejected)、无法控制时间戳分布(所有申请都在同一秒)、无法生成关联的还款计划。而Django Shell可编程控制每一条数据的字段值、外键关系、时间偏移,且执行速度是Web请求的100倍以上。更重要的是,credit_application表有created_atupdated_atdisbursement_date三个时间字段,它们的时序关系(如disbursement_date >= approved_at)直接影响报表统计逻辑——只有Shell能保证这种业务约束。
5.2 批量生成脚本:复制粘贴就能跑,含3类典型场景
在项目根目录执行python manage.py shell,然后一次性粘贴以下代码(已测试通过):
import random from datetime import datetime, timedelta from decimal import Decimal from django.contrib.auth.models import User from credit.models import CreditCustomer, CreditApplication, CreditApprovalFlow # 获取测试用户 manager = User.objects.get(username='manager001') risk = User.objects.get(username='risk001') director = User.objects.get(username='admin') # 假设admin是主管 # 生成100个客户 customers = [] for i in range(100): name = f"客户{i:03d}" id_card = f"11010119{(1980+i%40):d}0101{(i*123)%1000:03d}{random.choice(['X','x','0','1','2','3','4','5','6','7','8','9'])}" phone = f"1{random.choice(['3','5','7','8'])}{random.randint(100000000, 999999999)}" income = Decimal(f"{random.randint(5, 50)}0000.00") # 5万~50万 customer = CreditCustomer.objects.create( name=name, id_card=id_card, phone=phone, annual_income=income, address=f"北京市朝阳区测试路{i}号", occupation=random.choice(['IT工程师', '教师', '医生', '公务员', '自由职业']), created_at=datetime.now() - timedelta(days=random.randint(0, 30)) ) customers.append(customer) # 生成100个申请,分3种状态 statuses = ['pending', 'approved', 'rejected'] for i, customer in enumerate(customers): # 随机状态 status = random.choice(statuses) # 构造申请时间(过去30天内) apply_time = datetime.now() - timedelta(days=random.randint(0, 30), hours=random.randint(0, 23)) # 构造审批时间(仅对approved/rejected) approved_at = None rejected_at = None if status == 'approved': approved_at = apply_time + timedelta(hours=random.randint(1, 48)) elif status == 'rejected': rejected_at = apply_time + timedelta(hours=random.randint(1, 24)) # 放款时间(仅approved有) disbursement_date = None if status == 'approved': disbursement_date = approved_at + timedelta(days=random.randint(1, 5)) app = CreditApplication.objects.create( application_id=f"APP{i:06d}", customer=customer, loan_amount=Decimal(f"{random.randint(10, 100)}0000.00"), annual_rate=Decimal(f"{random.choice([0.06, 0.07, 0.08, 0.085, 0.09]):.3f}"), loan_term=random.choice([12, 24, 36, 60]), purpose=random.choice(['购房', '装修', '教育', '经营', '消费']), status=status, created_at=apply_time, updated_at=apply_time, approved_at=approved_at, rejected_at=rejected_at, disbursement_date=disbursement_date, applicant=manager, current_approver=risk.username if status == 'pending' else director.username ) # 生成审批流记录 CreditApprovalFlow.objects.create( application=app, approver=manager, role='客户经理', status='approved', approved_at=apply_time, comments='初审通过' ) if status in ['approved', 'rejected']: CreditApprovalFlow.objects.create( application=app, approver=risk, role='风控专员', status=status, approved_at=approved_at if status == 'approved' else rejected_at, comments='风控审核通过' if status == 'approved' else '收入证明不足' ) CreditApprovalFlow.objects.create( application=app, approver=director, role='风控主管', status=status, approved_at=approved_at if status == 'approved' else rejected_at, comments='终审通过' if status == 'approved' else '否决' ) print("✅ 100条测试数据生成完毕!") print(f" pending: {CreditApplication.objects.filter(status='pending').count()}") print(f" approved: {CreditApplication.objects.filter(status='approved').count()}") print(f" rejected: {CreditApplication.objects.filter(status='rejected').count()}")逻辑说明:脚本用
random模块生成符合现实分布的数据——身份证号校验码随机但合法、手机号符合11位规则、年收入在5~50万区间、贷款金额10~100万、利率覆盖6%~9%主流区间。CreditApprovalFlow表为每个申请生成3条记录,模拟完整审批链路。执行后,CreditApplication.objects.count()应返回100。
5.3 验证数据质量:3条SQL快速检查业务逻辑是否生效
生成数据后,用MySQL客户端执行以下查询,验证核心业务逻辑:
-- 1. 检查“待审批”申请是否都指向风控专员(而非空) SELECT COUNT(*) FROM credit_application WHERE status='pending' AND current_approver != ''; -- 2. 检查“已放款”申请的放款日期是否晚于审批通过日 SELECT COUNT(*) FROM credit_application WHERE status='approved' AND disbursement_date IS NOT NULL AND disbursement_date < approved_at; -- 3. 检查还款计划表是否为空(合同生成后应有数据) SELECT COUNT(*) FROM credit_loan_contract WHERE repayment_schedule IS NOT NULL;预期结果:第1条返回100(全部pending申请都有current_approver),第2条返回0(无放款早于审批),第3条返回approved申请的数量(如30条)。若第2条非0,说明generate_loan_contract()未被调用,需检查post_save信号是否绑定。
5.4 压力测试基线:用curl模拟并发提交,测出你的服务器瓶颈
有了100条数据,下一步是测接口吞吐。用curl发10个并发请求,观察响应时间:
# 测试申请接口(需先获取csrf token) curl -X GET http://127.0.0.1:8000/apply/ -b "sessionid=xxx" -s -o /dev/null -w "GET申请页: %{http_code} %{time_total}s\n" # 测试提交接口(POST,需构造表单数据) curl -X POST http://127.0.0.1:8000/apply/ \ -H "Content-Type: application/x-www-form-urlencoded" \ -b "sessionid=xxx" \ -d "customer_name=压力测试客户" \ -d "id_card=11010119900307275X" \ -d "phone=13800138000" \ -d "annual_income=100000.00" \ -d "loan_amount=50000.00" \ -d "annual_rate=0.075" \ -d "loan_term=24" \ -d "purpose=装修" \ -s -o /dev/null -w "POST申请: %{http_code} %{time_total}s\n"技巧:
-w参数输出HTTP状态码和总耗时。若time_total超过2s,说明视图层或数据库层有瓶颈。此时打开Django Debug Toolbar(settings.py中DEBUG=True且INSTALLED_APPS含debug_toolbar),看SQL查询次数——本项目正常应≤3次/请求(1次客户查重、1次申请插入、1次审批流插入)。若超10次,检查views.py中是否有多余的.all()或.count()。
从那以后我每次拿到新源码包,第一件事就是进Django Shell跑CreditApplication.objects.all()[:5],看数据能不能出来;第二件事是python manage.py showmigrations,确认迁移没卡住;第三件事是grep -r "mysqlclient" requirements.txt,确保依赖写死版本。这三步走完,80%的“跑不起来”问题当场消失。希望帮到你。
本文还有配套的精品资源,点击获取