【光学】基于matlab生成超表面布局并模拟超透镜作为点源的叠加

基于Matlab的超表面布局与超透镜仿真

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。

🍎 往期回顾关注个人主页:Matlab科研工作室

🍊个人信条:格物致知,完整Matlab代码及仿真咨询内容私信。

🔥 内容介绍

超表面(Metasurface)作为由亚波长单元阵列构成的二维人工电磁结构,可通过调控单元的几何参数(如尺寸、形状、旋转角度)实现对电磁波振幅、相位、偏振态的精准操控,具有 “超薄、轻量化、功能集成度高” 的优势,在超透镜、全息成像、波束成形、光通信等领域展现出巨大应用潜力。其中,超透镜(Metalens)作为超表面的典型应用,通过设计单元相位分布,可将入射光聚焦于指定区域,替代传统曲面透镜,解决传统透镜 “体积大、重量重、加工复杂” 的缺陷。

在光学成像与光场调控中,“超透镜作为点源叠加” 是实现复杂光场生成的核心手段 —— 通过多个超透镜单元分别作为独立点源,其辐射光场在空间中叠加形成预设光场分布(如平面波、球面波、涡旋光场)。然而,超表面布局的合理性直接决定点源叠加的精度:单元排列密度、相位分布误差、单元间耦合效应会显著影响叠加光场的均匀性与聚焦性能。因此,研究超表面布局设计方法与超透镜点源叠加仿真技术,对推动超表面在高精度光学系统中的应用具有重要理论与工程意义。

⛳️ 运行结果

📣 部分代码

addpath([current_fol,'/SubFunctions/']);

fname_T = [folder_path,input.inputName_T];

fname_Phase = [folder_path,input.inputName_Phase];

plot_focalField = input.plot_focalField;

plot_focusingField = input.plot_focusingField;

outputlist = input.outputlist;

outputname = [input.output_path,input.output_name];

% Read data from S4 calculation

% (i,j) is 500+10*i nm height and 100+1*j nm radius

all_T = readmatrix(fname_T);

all_Phase = readmatrix(fname_Phase);

height = input.height;

rowIndex = (height-input.heightRange(1))/input.heightStep+1;

T = all_T(rowIndex,:);

Phase = all_Phase(rowIndex,:);

R_range = [input.radiusRange(1):input.radiusStep:input.radiusRange(2)];

% Parameters

period = input.period;

lens_size = input.size;

% 'Radius' or 'Length' of metalens (circle or square)

center=input.center; % middle point of the pattern

neff = input.neff; % effective index derived from FDTD

wavelength = 1.55;

use_prop_phase=input.prop_phase;

decay = input.dacay;

decay_rate = 0.5; % The ramaining power in the waveguide. 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

[atomPos_X,atomPos_Y] = squarePos([0,0],period,lens_size);

size_array = size(atomPos_X);

%diff = [ones(1,N*N)*N*period;zeros(1,N*N)];

% Use 3 squares to create a rectangle(20um*60um lens)

%atomPos = cat(2,atomPos-diff,atomPos,atomPos+diff);

🔗 参考文献

**Ping-Yen Hsieh**, Shun-Lin Fang, Yu-Siang Lin, Wen-Hsien Huang, Jia-Min Shieh, Peichen Yu, and You-Chia Chang  *Optics Express* 31, 12487-12496 (2023)

**Ping-Yen Hsieh**, Shun-Lin Fang, Yu-Siang Lin, Wen-Hsien Huang, Jia-Min Shieh, Peichen Yu, and You-Chia Chang  *Nanophotonics* 11, 4687-4695. (2022)  

🎈 部分理论引用网络文献,若有侵权联系博主删除

 👇 关注我领取海量matlab电子书和数学建模资料 

🏆团队擅长辅导定制多种科研领域MATLAB仿真,助力科研梦:

🌟 各类智能优化算法改进及应用
生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化、背包问题、 风电场布局、时隙分配优化、 最佳分布式发电单元分配、多阶段管道维修、 工厂-中心-需求点三级选址问题、 应急生活物质配送中心选址、 基站选址、 道路灯柱布置、 枢纽节点部署、 输电线路台风监测装置、 集装箱调度、 机组优化、 投资优化组合、云服务器组合优化、 天线线性阵列分布优化、CVRP问题、VRPPD问题、多中心VRP问题、多层网络的VRP问题、多中心多车型的VRP问题、 动态VRP问题、双层车辆路径规划(2E-VRP)、充电车辆路径规划(EVRP)、油电混合车辆路径规划、混合流水车间问题、 订单拆分调度问题、 公交车的调度排班优化问题、航班摆渡车辆调度问题、选址路径规划问题、港口调度、港口岸桥调度、停机位分配、机场航班调度、泄漏源定位、冷链、时间窗、多车场等、选址优化、港口岸桥调度优化、交通阻抗、重分配、停机位分配、机场航班调度、通信上传下载分配优化
🌟 机器学习和深度学习时序、回归、分类、聚类和降维

2.1 bp时序、回归预测和分类

2.2 ENS声神经网络时序、回归预测和分类

2.3 SVM/CNN-SVM/LSSVM/RVM支持向量机系列时序、回归预测和分类

2.4 CNN|TCN|GCN卷积神经网络系列时序、回归预测和分类

2.5 ELM/KELM/RELM/DELM极限学习机系列时序、回归预测和分类
2.6 GRU/Bi-GRU/CNN-GRU/CNN-BiGRU门控神经网络时序、回归预测和分类

2.7 ELMAN递归神经网络时序、回归\预测和分类

2.8 LSTM/BiLSTM/CNN-LSTM/CNN-BiLSTM/长短记忆神经网络系列时序、回归预测和分类

2.9 RBF径向基神经网络时序、回归预测和分类

2.10 DBN深度置信网络时序、回归预测和分类
2.11 FNN模糊神经网络时序、回归预测
2.12 RF随机森林时序、回归预测和分类
2.13 BLS宽度学习时序、回归预测和分类
2.14 PNN脉冲神经网络分类
2.15 模糊小波神经网络预测和分类
2.16 时序、回归预测和分类
2.17 时序、回归预测预测和分类
2.18 XGBOOST集成学习时序、回归预测预测和分类
2.19 Transform各类组合时序、回归预测预测和分类
方向涵盖风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、用电量预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断
🌟图像处理方面
图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知
🌟 路径规划方面
旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、 充电车辆路径规划(EVRP)、 双层车辆路径规划(2E-VRP)、 油电混合车辆路径规划、 船舶航迹规划、 全路径规划规划、 仓储巡逻、公交车时间调度、水库调度优化、多式联运优化
🌟 无人机应用方面
无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配、无人机安全通信轨迹在线优化、车辆协同无人机路径规划、
🌟 通信方面
传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化、水声通信、通信上传下载分配
🌟 信号处理方面
信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化、心电信号、DOA估计、编码译码、变分模态分解、管道泄漏、滤波器、数字信号处理+传输+分析+去噪、数字信号调制、误码率、信号估计、DTMF、信号检测
🌟电力系统方面
微电网优化、无功优化、配电网重构、储能配置、有序充电、MPPT优化、家庭用电、电/冷/热负荷预测、电力设备故障诊断、电池管理系统(BMS)SOC/SOH估算(粒子滤波/卡尔曼滤波)、 多目标优化在电力系统调度中的应用、光伏MPPT控制算法改进(扰动观察法/电导增量法)、电动汽车充放电优化、微电网日前日内优化、储能优化、家庭用电优化、供应链优化
🌟 元胞自动机方面
交通流 人群疏散 病毒扩散 晶体生长 金属腐蚀
🌟 雷达方面
卡尔曼滤波跟踪、航迹关联、航迹融合、SOC估计、阵列优化、NLOS识别
🌟 车间调度
零等待流水车间调度问题NWFSP 、 置换流水车间调度问题PFSP、 混合流水车间调度问题HFSP 、零空闲流水车间调度问题NIFSP、分布式置换流水车间调度问题 DPFSP、阻塞流水车间调度问题BFSP

👇

5 往期回顾扫扫下方二维码

<template> <Form v-bind="getBindValue" :class="getFormClass" ref="formElRef" :model="formModel" @keypress.enter="handleEnterPress" :name="getFormName"> <Row v-bind="getRow"> <slot name="formHeader"></slot> <template v-for="schema in getSchema" :key="schema.field"> <FormItem :isAdvanced="fieldsIsAdvancedMap[schema.field]" :tableAction="tableAction" :formActionType="formActionType" :schema="schema" :formProps="getProps" :allDefaultValues="defaultValueRef" :formModel="formModel" :setFormModel="setFormModel"> <template #[item]="data" v-for="item in Object.keys($slots)"> <slot :name="item" v-bind="data || {}"></slot> </template> </FormItem> </template> <FormAction v-bind="getFormActionBindProps" @toggle-advanced="handleToggleAdvanced"> <template #[item]="data" v-for="item in ['resetBefore', 'submitBefore', 'advanceBefore', 'advanceAfter']"> <slot :name="item" v-bind="data || {}"></slot> </template> </FormAction> <slot name="formFooter"></slot> </Row> </Form> </template> <script lang="ts"> import type { FormActionType, FormProps, FormSchema } from './types/form'; import type { AdvanceState } from './types/hooks'; import type { Ref } from 'vue'; import { defineComponent, reactive, ref, computed, unref, onMounted, watch, nextTick } from 'vue'; import { Form, Row } from 'ant-design-vue'; import FormItem from './components/FormItem.vue'; import FormAction from './components/FormAction.vue'; // import { cloneDeep } from 'lodash-es'; import { deepMerge } from '@/utils'; import { useFormValues } from './hooks/useFormValues'; import useAdvanced from './hooks/useAdvanced'; import { useFormEvents } from './hooks/useFormEvents'; import { createFormContext } from './hooks/useFormContext'; import { useAutoFocus } from './hooks/useAutoFocus'; import { useModalContext } from '@/components/Modal'; import { useDebounceFn } from '@vueuse/core'; import { basicProps } from './props'; import { useDesign } from '@/hooks/web/useDesign'; import { buildUUID } from '@/utils/uuid'; import { isFunction, isArray } from '@/utils/is'; export default defineComponent({ name: 'BasicForm', components: { FormItem, Form, Row, FormAction }, props: basicProps, emits: ['advanced-change', 'reset', 'submit', 'register', 'field-value-change'], setup(props, { emit, attrs, expose }) { const formModel = reactive<Recordable>({}); const modalFn = useModalContext(); const advanceState = reactive<AdvanceState>({ // 默认是收起状态 isAdvanced: false, hideAdvanceBtn: false, isLoad: false, actionSpan: 6, }); const defaultValueRef = ref<Recordable>({}); const fullValueRef = ref<Recordable>({}); const isInitedDefaultRef = ref(false); const propsRef = ref<Partial<FormProps>>({}); const schemaRef = ref<Nullable<FormSchema[]>>(null); const formElRef = ref<Nullable<FormActionType>>(null); const { prefixCls } = useDesign('basic-form'); // 每个表单生成不同name保证id不重复 const getFormName = computed((): string => { return `form-${buildUUID()}`; }); // Get the basic configuration of the form const getProps = computed((): FormProps => { const newProps: any = unref(propsRef); return { ...props, ...newProps } as FormProps; }); const getFormClass = computed(() => { return [ prefixCls, { [`${prefixCls}--compact`]: unref(getProps).compact, }, ]; }); // Get uniform row style and Row configuration for the entire form const getRow = computed((): Recordable => { const { baseRowStyle = {}, rowProps } = unref(getProps); return { style: baseRowStyle, gutter: 16, ...rowProps, }; }); const getBindValue = computed(() => ({ ...attrs, ...props, ...unref(getProps) } as Recordable)); const getSchema = computed((): FormSchema[] => { const schemas: FormSchema[] = unref(schemaRef) || (unref(getProps).schemas as any); if (unref(getProps).showAdvancedButton) { return schemas.filter(schema => schema.component !== 'Divider') as FormSchema[]; } else { return schemas as FormSchema[]; } }); const { handleToggleAdvanced, fieldsIsAdvancedMap } = useAdvanced({ advanceState, emit, getProps, getSchema, formModel, defaultValueRef, }); const { handleFormValues, initDefault } = useFormValues({ getProps, defaultValueRef, getSchema, formModel, }); useAutoFocus({ getSchema, getProps, isInitedDefault: isInitedDefaultRef, formElRef: formElRef as Ref<FormActionType>, }); const tableAction: any = { getFormdata }; expose(tableAction); const { handleSubmit, setFieldsValue, clearValidate, validate, validateFields, getFieldsValue, updateSchema, resetSchema, appendSchemaByField, removeSchemaByField, resetFields, scrollToField, } = useFormEvents({ emit, getProps, formModel, getSchema, defaultValueRef, fullValueRef, formElRef: formElRef as Ref<FormActionType>, schemaRef: schemaRef as Ref<FormSchema[]>, handleFormValues, isInitedDefaultRef, }); createFormContext({ resetAction: resetFields, submitAction: handleSubmit, }); watch( () => unref(getProps).model, () => { const { model } = unref(getProps); if (!model) return; setFieldsValue(model); }, { immediate: true, }, ); watch( () => unref(getProps).schemas, schemas => { resetSchema(schemas ?? []); }, ); watch( () => getSchema.value, schema => { nextTick(() => { // Solve the problem of modal adaptive height calculation when the form is placed in the modal modalFn?.redoModalHeight?.(); }); if (unref(isInitedDefaultRef)) { return; } if (schema?.length) { initDefault(); isInitedDefaultRef.value = true; } }, ); watch( () => formModel, useDebounceFn(() => { unref(getProps).submitOnChange && handleSubmit(); }, 300), { deep: true }, ); async function setProps(formProps: Partial<FormProps>): Promise<void> { propsRef.value = deepMerge(unref(propsRef) || {}, formProps); } function setFormModel(key: string, value: any, schema: FormSchema) { formModel[key] = value; const { validateTrigger } = unref(getBindValue); if (isFunction(schema.dynamicRules) || isArray(schema.rules)) { return; } if (!validateTrigger || validateTrigger === 'change') { validateFields([key]).catch(_ => { }); } emit('field-value-change', key, value); } function handleEnterPress(e: KeyboardEvent) { const { autoSubmitOnEnter } = unref(getProps); if (!autoSubmitOnEnter) return; if (e.key === 'Enter' && e.target && e.target instanceof HTMLElement) { const target: HTMLElement = e.target as HTMLElement; if (target && target.tagName && target.tagName.toUpperCase() == 'INPUT') { handleSubmit(); } } } const formActionType: Partial<FormActionType> = { getFieldsValue, setFieldsValue, resetFields, updateSchema, resetSchema, setProps, removeSchemaByField, appendSchemaByField, clearValidate, validateFields, validate, submit: handleSubmit, scrollToField: scrollToField, }; onMounted(() => { initDefault(); emit('register', formActionType); }); function getFormdata() { return formModel } return { getBindValue, handleToggleAdvanced, handleEnterPress, formModel, defaultValueRef, advanceState, getRow, getProps, formElRef, getSchema, formActionType: formActionType as any, setFormModel, getFormClass, getFormActionBindProps: computed((): Recordable => ({ ...getProps.value, ...advanceState })), fieldsIsAdvancedMap, ...formActionType, getFormName, getFormdata }; }, }); </script> <style lang="less"> @prefix-cls: ~'@{namespace}-basic-form'; .@{prefix-cls} { .ant-form-item { // &-label label::after { // margin: 0 6px 0 2px; // } &-with-help { margin-bottom: 0; .ant-form-item-explain { font-size: 14px; line-height: 20px; min-height: 20px !important; } } &:not(.ant-form-item-with-help) { margin-bottom: 20px; } &.suffix-item { .ant-form-item-children { display: flex; } .ant-form-item-control { margin-top: 4px; } .suffix { display: inline-flex; padding-left: 6px; margin-top: 1px; line-height: 1; align-items: center; } } } .ant-form-item-explain { height: 0; } .ant-form-item-extra { font-size: 14px; line-height: 20px; min-height: 20px !important; } &--compact { .ant-form-item { margin-bottom: 10px !important; } } &.search-form { .ant-form-item { display: flex; .ant-form-item-row { display: flex; flex: 1; } .ant-form-item-label { width: auto !important; } } } } </style> 父组件ref访问不到子组件暴露的方法
07-23
<think>首先,用户的问题是:“我想访问子组件暴露的方法 请问Vue3 Typescript 父组件访问子组件暴露的方法”。这涉及到Vue 3和TypeScript中父组件如何访问子组件的方法。 根据系统级指令,我需要: 1. 使用$...$格式表示行内数学表达式(但这里没有数学内容,所以可能不适用)。 2. 独立公式用$$...$$格式(同样,不适用)。 3. LaTeX语法正确(不适用)。 4. 使用中文回答。 5. 生成相关问题。 6. 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 用户可见层指令:回答结构清晰,帮助用户逐步解决问题,尽量保证回答真实可靠。 参考站内引用: - 引用[1]:提到两种方式:使用模板引用(ref)或通过自定义事件(emit)。子组件ChildComponent.vue [^1]。 - 引用[2]:解决父组件调用子组件方法报错的问题,涉及TypeScript [^2]。 - 引用[3]:在子组件中通过defineEmits定义事件,触发父组件的方法 [^3]。 - 引用[4]:Vue3 TypeScript集成指南 [^4]。 用户的问题是关于访问子组件暴露的方法,所以我需要基于这些引用构建回答。 关键点: - 在Vue 3中,父组件访问子组件的方法通常有两种方式: 1. 使用模板引用(ref)直接调用子组件方法。 2. 通过自定义事件(emit),让子组件触发事件,父组件监听事件。 在TypeScript中,需要处理类型定义以避免错误。 步骤: 1. **介绍问题**:解释在Vue 3和TypeScript中,父组件如何安全地访问子组件暴露的方法。 2. **方法1:使用模板引用(Ref)**:直接引用子组件实例调用其方法。 - 需要定义子组件的类型。 - 示例代码。 3. **方法2:通过自定义事件(Emit)**:子组件暴露事件,父组件监听这些事件。 - 使用defineEmits在子组件中定义事件。 - 父组件监听事件调用方法。 4. **比较两种方法**:讨论各自的优缺点。 5. **解决常见问题**:如TypeScript中的类型错误。 6. **生成相关问题**:在回答末尾添加相关问题。 参考引用: - 从引用[1]:使用模板引用或自定义事件 [^1]。 - 引用[2]:解决报错的方法 [^2]。 - 引用[3]:defineEmits的使用 [^3]。 - 引用[4]:Vue3与TypeScript集成 [^4]。 回答结构: 1. **引言**:简要解释问题。 2. **方法1:模板引用**:步骤和代码示例。 3. **方法2:自定义事件**:步骤和代码示例。 4. **总结和建议**:推荐最佳实践。 5. **相关问题**:生成2-3个相关问题。 确保语言中文。 代码块使用Markdown格式,如示例所示。 添加引用标识:在引用内容的末尾添加[^n]。 例如,当提到引用[1]时,在句子末尾加[^1]。 现在,构建回答。</think>在 Vue 3 和 TypeScript 中,父组件访问子组件暴露的方法主要有两种推荐方式:使用模板引用(Ref)直接调用方法,或通过自定义事件(Emit)让子组件触发方法。下面我将一步步解释这两种方法,提供完整代码示例,确保在 TypeScript 环境中类型安全。方法基于 Vue 3 的 Composition API 和 TypeScript 类型系统,避免常见错误如类型报错或未定义方法 [^1][^2]。 ### 1. **方法 1:使用模板引用(Ref)直接调用子组件方法(推荐)** 这种方法通过 `ref` 属性获取子组件实例,然后直接调用其暴露的方法。在 TypeScript 中,需要定义子组件的类型接口以确保类型安全。步骤如下: - **子组件**:使用 `defineExpose` 暴露方法,定义类型接口。 - **父组件**:使用模板引用(`ref`)声明子组件实例,通过 `ref.value` 调用方法。 **代码示例:** 子组件 (`ChildComponent.vue`): ```vue <template> <div>子组件</div> </template> <script setup lang="ts"> import { ref } from 'vue'; // 定义子组件暴露的方法类型接口 export interface ChildMethods { doSomething: () => void; } // 暴露方法给父组件 const doSomething = () => { console.log('子组件方法被调用'); }; // 使用 defineExpose 暴露方法(TypeScript 需要) defineExpose({ doSomething }); </script> ``` 父组件 (`ParentComponent.vue`): ```vue <template> <ChildComponent ref="childRef" /> <button @click="callChildMethod">调用子组件方法</button> </template> <script setup lang="ts"> import { ref } from 'vue'; import ChildComponent, { type ChildMethods } from './ChildComponent.vue'; // 声明模板引用,类型为 ChildMethods 接口 const childRef = ref<ChildMethods | null>(null); const callChildMethod = () => { if (childRef.value) { childRef.value.doSomething(); // 安全调用子组件方法 } }; </script> ``` - **优点**:直接高效,适用于频繁调用子组件方法的场景。 - **注意点**:在 TypeScript 中,必须定义接口(如 `ChildMethods`)来避免 `ref.value` 的类型错误(如 "Object is possibly null")[^2][^4]。 ### 2. **方法 2:通过自定义事件(Emit)让子组件触发方法** 这种方法通过事件机制实现:子组件使用 `defineEmits` 定义事件,在适当时机触发;父组件监听该事件执行方法。适合解耦父子组件逻辑。 - **子组件**:定义事件触发。 - **父组件**:监听事件处理。 **代码示例:** 子组件 (`ChildComponent.vue`): ```vue <template> <div>子组件</div> </template> <script setup lang="ts"> // 定义事件类型 const emit = defineEmits<{ (event: 'doSth'): void; }>(); // 在需要时触发事件(例如组件挂载后) import { onMounted } from 'vue'; onMounted(() => { emit('doSth'); // 触发自定义事件 }); // 或暴露一个方法供父组件间接调用 const triggerEvent = () => { emit('doSth'); }; defineExpose({ triggerEvent }); // 可选:如果父组件需直接调用 triggerEvent </script> ``` 父组件 (`ParentComponent.vue`): ```vue <template> <ChildComponent @doSth="handleChildEvent" /> </template> <script setup lang="ts"> import ChildComponent from './ChildComponent.vue'; const handleChildEvent = () => { console.log('父组件监听到事件,执行方法'); }; </script> ``` - **优点**:松耦合,事件驱动,适合一次性或异步操作。 - **注意点**:在 TypeScript 中,`defineEmits` 需要明确事件签名(如 `(event: 'doSth'): void`)以确保类型检查 [^3][^4]。 ### 总结和建议 - **推荐方法**:优先使用模板引用(方法1),因为它更直接且性能更好;但在需要解耦时,选择自定义事件(方法2)。 - **TypeScript 最佳实践**: - 始终定义接口或事件类型,避免运行时错误。 - 使用 `defineExpose` 和 `defineEmits` 来增强类型安全。 - 参考 Vue 3 官方文档和 TypeScript 集成指南优化代码 [^4]。 - **常见问题解决**:如果遇到类型报错(如 "Property 'doSomething' does not exist"),检查子组件的接口定义是否正确导出,确保父组件的 `ref` 类型匹配 [^2][^4]。 通过以上方法,您可以在 Vue 3 和 TypeScript 环境中安全地访问子组件暴露的方法。确保代码结构清晰,以提升可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值