用laravel4.2实现一个简单的图片墙博客(三)控制器(Controller)

Laravel Resource Controller 入门:CRUD 七种动作原理与工程实践 Resource Controller 是 Laravel 对 RESTful 资源操作的核心抽象,其本质是将增删改查(CRUD)标准化为 index、create、store、show、edit、update、destroy 七种语义化动作,并通过约定优于配置实现路由自动注册、模型绑定、表单验证集成与中间件统一管理。它并非代码生成器,而是 Web 应用数据交互模式的工程化封装,技术价值在于降低重复劳动、规避 URL 硬编码、防止 HTTP 方法错配,并天然支撑 API 优先架构。典型应用场景包括后台管理系 阅读详情

至此,我们完成了数据库的建立和初始填充工作,也建立的三个主要对象的模型User, Picture, Comment,接下来要实现控制器部分了。

与其把所有路由逻辑写在一个 routes.php 文件中,你也许更希望用控制器类来组织它们。控制器可以把相关的路由逻辑组织在一个类中,而且可以使用由框架提供的更为强大的功能,比如自动依赖注入。关于控制器方面的文档参看。

一.创建控制器

在Laravel中,我们通过扩展 app/controllers 目录的BaseController类来创建控制器,我们所有的控制器都存在app/controllers目录中。文件管理方面这一点类似MODEL,使用一个文件当作入口来管理所有的同类文件。

1#......BaseController.php

这是基控制器,$layout指定了初始布局,指向views目录下的master.blade.php。

调用setupLayout方法在控制器有非空布局时实现这个布局。其他的控制器基本都可以继承该控制器。

<?php

class BaseController extends \Controller {


	/**
	 * layout to use
	 * @var View
	 */
	protected $layout = 'master';

	/**
	 * Setup the layout used by the controller.
	 *
	 * @return void
	 */
	protected function setupLayout()
	{
		if ( ! is_null($this->layout) )
		{
			$this->layout = View::make($this->layout);
		}
	}

}

2#......BlogController.php

__construct使我们能够在控制器内部指定过滤器,过滤器的定义在app/filters.php。

getIndex()获取主页显示的元素,每页显示20张图片,调用布局home,在home.blade.php中的{{content}}部分填充布局index,布局由构造出的20张图片的键值对数组生成,这一步相当于显示了主页。

getLogin()获取验证状态并转移页面到管理员控制面板

getLogout()登出用户

postRegister()注册验证,需要验证未使用用户名和未使用的邮箱地址

postLogin()登陆验证

<?php

use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\Schema;
class BlogController extends BaseController
{


    public function __construct()
    {
        //updated: prevents re-login.
        $this->beforeFilter('guest', ['only' => ['getLogin']]);
        $this->beforeFilter('auth', ['only' => ['getLogout']]);
    }

    public function getIndex()
    {
        $pictures = Picture::orderBy('id', 'desc')->paginate(10);
        $pictures->getFactory()->setViewName('pagination::slider');
        $this->layout->title = 'Home Page | Picture Wall Blog';
        $this->layout->main = View::make('home')->nest('content', 'index', compact('pictures'));
    }

    public function getSearch()
    {
    	$searchTerm = Input::get('s');
    	$pictures = Picture::whereRaw('match(title,description) against(? in boolean mode)', [$searchTerm])
    	->paginate(10);
    	$pictures->getFactory()->setViewName('pagination::slider');
    	$pictures->appends(['s' => $searchTerm]);
    	$this->layout->with('title', 'Search: ' . $searchTerm);
    	$this->layout->main = View::make('home')
    	->nest('content', 'index', ($pictures->isEmpty()) ? ['notFound' => true] : compact('pictures'));
    }
    public function getLiking()
    {
    	$pic_id = Input::get('pic_id');
    	if (Auth::check()){
    		$user_id = Auth::user()->id;
    	} else return 'not logined';
    	$like = DB::connection('mongodb')->table('likes')->where('picture_id', '=', $pic_id)->where('user_id', '=', $user_id)->get();
    	if (!empty($like)) return 'voted';
    	DB::connection('mongodb')->table('likes')->insert(array('user_id' => $user_id, 'picture_id' => $pic_id));
    	$count = DB::connection('mongodb')->table('count')->where('picture_id', '=', $pic_id)->lists('count');
    	if (empty($count)){
    		DB::connection('mongodb')->table('count')->insert(array('picture_id'=>$pic_id, 'count'=>'1'));
    	} else{
    		$up = $count[0]+1;
    		DB::connection('mongodb')->table('count')->where('picture_id',$pic_id)->
    				update(array('count'=>$up));
    	}
    	return "ok";
    	
    }
    public function getLikes()
    {
    	$pic_id = Input::get('pic_id');
    	$likecount = DB::connection('mongodb')->table('count')->where('picture_id', $pic_id)->lists('count');
    	if (empty($likecount)) return 0;
    	return $likecount[0];
    }
    public function getLogin()
    {
        $this->layout->title = 'login';
        $this->layout->main = View::make('login');
    }
	
    public function getRegister()
    {
    	$this->layout->title = 'register';
    	$this->layout->main = View::make('register');
    }
    
    public function postRegister()
    {
    	$credentials = [
    	'username' => Input::get('username'),
    	'password' => Input::get('password'),
    	'email' => Input::get('email')
    	];
    	$rules = [
    	'username' => 'required',
    	'password' => 'required',
    	'email' => 'required|email'
    			];
    	$validator = Validator::make($credentials, $rules);
    	if ($validator->passes()) {
    		$userCheck = DB::table('users')->where('username',$credentials['username'])->get();
    		if (!empty($userCheck)){
    			return Redirect::back()->withInput()->with('failure', 'username already exists!');
    		}
    		$emailCheck = DB::table('users')->where('email',$credentials['email'])->get();
    		if (!empty($emailCheck)){
    			return Redirect::back()->withInput()->with('failure', 'mail address already exists!');
    		}
    		$user = array(
            'username' => $credentials['username'],
            'password' => Hash::make($credentials['password']),
    		'email' => $credentials['email'],
            'created_at' => DB::raw('NOW()'),
            'updated_at' => DB::raw('NOW()'),
       	 	);
    		DB::table('users')->insert($user);
    		Auth::attempt($credentials);
    		return Redirect::to('admin/dash-board')->withInput()->with('success', 'register succeed!!!');
    	} else {
    		return Redirect::back()->withErrors($validator)->withInput();
    	}
    }
    
    public function postLogin()
    {
    	if (strcmp($_POST['operation'],"Register") == 0) return Redirect::to('register');
        $credentials = [
            'username' => Input::get('username'),
            'password' => Input::get('password')
        ];
        $rules = [
            'username' => 'required',
            'password' => 'required'
        ];
        $validator = Validator::make($credentials, $rules);
        if ($validator->passes()) {
            if (Auth::attempt($credentials))
                return Redirect::to('admin/dash-board');
            return Redirect::back()->withInput()->with('failure', 'username or password is invalid!');
        } else {
            return Redirect::back()->withErrors($validator)->withInput();
        }
    }

    public function getLogout()
    {
        Auth::logout();
        return Redirect::to('/');
    }

}



3#......PictureController.php

该文件定义了Picture的控制器,包括列举Picture,显示Picture,新建、编辑的界面,删除、保存、更新的操作等。这些方法会在app/routes.php中被引用。

其中用到了验证器的相关知识(请注意正则匹配的格式),参考 

<?php

class PictureController extends BaseController
{

    /* get functions */
    public function listPicture()
    {
        $pictures = Picture::orderBy('id', 'desc')->paginate(10);
        $this->layout->title = 'Picture listings';
        $this->layout->main = View::make('dash')->nest('content', 'pictures.list', compact('pictures'));
    }

    public function showPicture(Picture $picture)
    {
        $comments = $picture->comments()->get();
        $this->layout->title = $picture->title;
        $this->layout->main = View::make('home')->nest('content', 'pictures.single', compact('picture', 'comments'));
    }

    public function newPicture()
    {
        $this->layout->title = 'New Picture';
        $this->layout->main = View::make('dash')->nest('content', 'pictures.new');
    }

    public function editPicture(Picture $picture)
    {
        $this->layout->title = 'Edit Picture';
        $this->layout->main = View::make('dash')->nest('content', 'pictures.edit', compact('picture'));
    }

    public function deletePicture(Picture $picture)
    {
    	DB::connection('mongodb')->table('likes')->where('picture_id',$picture->id)->delete();
    	DB::connection('mongodb')->table('count')->where('picture_id',$picture->id)->delete();
        $picture->delete();
        return Redirect::route('picture.list')->with('success', 'Picture is deleted!');
    }

    /* picture functions */
    public function savePicture()
    {
    	$pre = "images/".date("YmdHis",time());
        $picture = [
            'title' => Input::get('title'),
            'description' => Input::get('description'),
            'image' => $_FILES['picture']['name'],
        ];
        $rules = [
            'title' => 'required',
            'description' => 'required',
            'image' => array('regex:/^[^&%]*\\.(jpg|gif|jpeg|png|bmp)$/u'),
        ];
        $messages = array(
        	'regex' => 'Please check there is no & and % character in the file path and is an image file!!'	
        );
        $valid = Validator::make($picture, $rules, $messages);
        if ($valid->passes()) {
        	$file_path = $_FILES['picture']['tmp_name'];
        	$image_path = "F:/mxampp/htdocs/piclist/public/".$pre.'/'.$_FILES['picture']['name'];
        	mkdir("F:/mxampp/htdocs/piclist/public/".$pre);
        	if (!move_uploaded_file($file_path, $image_path)){
        		return Redirect::to('admin/dash-board')->with('failure', 'wooops!!! failed on saving~');
        		//return Redirect::to('admin/dash_board')->with('failure', 'not valid picture');
        	} else{
        		$picture['image'] = $pre.'/'.$_FILES['picture']['name'];
            	$picture = new Picture($picture);
           	 	$picture->comment_count = 0;
            	$picture->save();
            	return Redirect::to('admin/dash-board')->with('success', 'Picture is saved!');
        	}
        } else
            return Redirect::back()->withErrors($valid)->withInput();
    }

    public function updatePicture(Picture $picture)
    {
        $data = [
            'title' => Input::get('title'),
            'description' => Input::get('description'),
        ];
        $rules = [
            'title' => 'required',
            'description' => 'required',
        ];
        $valid = Validator::make($data, $rules);
        if ($valid->passes()) {
            $picture->title = $data['title'];
            $picture->description = $data['description'];
            if (count($picture->getDirty()) > 0) /* avoiding resubmission of same content */ {
                $picture->save();
                return Redirect::back()->with('success', 'Picture is updated!');
            } else
                return Redirect::back()->with('success', 'Nothing to update!');
        } else
            return Redirect::back()->withErrors($valid)->withInput();
    }
	
}



4#......Comment.php

评论(Comment)的控制器,定义了所有评论相关的方法,注意picture->comment_count的改变,每次更新时也要更新这个计数器。

<?php


class CommentController extends BaseController
{


    /* get functions */
    public function listComment()
    {
        $comments = Comment::orderBy('id', 'desc')->paginate(20);
        $this->layout->title = 'Comment Listings';
        $this->layout->main = View::make('dash')->nest('content', 'comments.list', compact('comments'));
    }


    public function newComment(Picture $picture)
    {
        $comment = [
            'commenter' => Input::get('commenter'),
            'email' => Input::get('email'),
            'comment' => Input::get('comment'),
        ];
        $rules = [
            'commenter' => 'required',
            'email' => 'required | email',
            'comment' => 'required',
        ];
        $valid = Validator::make($comment, $rules);
        if ($valid->passes()) {
            $comment = new Comment($comment);
            $picture->comments()->save($comment);
            $picture->increment('comment_count');
            /* redirect back to the form portion of the page */
            return Redirect::to(URL::previous() . '#reply')
                ->with('success', 'Comment has been submitted!');
        } else {
            return Redirect::to(URL::previous() . '#reply')->withErrors($valid)->withInput();
        }
    }


    public function showComment(Comment $comment)
    {
        if (Request::ajax())
            return View::make('comments.show', compact('comment'));
        // handle non-ajax calls here
        //else{}
    }


    public function deleteComment(Comment $comment)
    {
        $picture = $comment->picture;
        $comment->delete();
        $picture->decrement('comment_count');
        return Redirect::back()->with('success', 'Comment deleted!');
    }


    /* picture functions */


    public function updateComment(Comment $comment)
    {
        $comment->save();
        $comment->picture->comment_count = Comment::where('picture_id', '=', $comment->picture->id)->count();
        $comment->picture->save();
        return Redirect::back();
    }


}

二.模型与路由的绑定

请查看

在app/routes.php中实现:

/* Model Bindings */
Route::model('picture', 'Picture');
Route::model('comment', 'Comment');
下一节将介绍路由和过滤器的相关设计


__________________________________________________________________________________________________

下一章将介绍路由和过滤器的实现,实现的路由和过滤器之后,我们整个博客的逻辑部分就算全部完成了~

对每个模型有对应的数据表,对模型的变化定义在控制器,通过路由的行为来调用控制器的方法,实现了用户与服务端交互的目的。

完成路由和过滤器之后,只要把所有页面的UI补充补充就能完成了,有点小激动呢~

修勾逃生巨人危机v10.9.9修改版:免广告无限内购与GM工具详解 游戏修改技术是通过对原版游戏程序进行代码层面的调整,实现特定功能的增强或限制解除。其核心原理涉及内存修改、资源替换和API拦截等技术手段,能够有效提升用户体验和测试效率。在移动游戏领域,免广告和无限内购是常见的技术实现方向,通过屏蔽广告SDK调用和修改内购验证逻辑,为用户提供更流畅的游戏体验。这类技术特别适合游戏开发者进行功能测试,以及玩家希望完整体验游戏内容而不受商业模式限制的场景。以修勾逃生巨人危机v10.9.9版本为例,该修改版集成了GM工具开启功能,通过特定操作路径即可激活调试面板,实现了广告去除和 阅读详情

相关推荐

使用基于物质点法(MPM)的Anura3D模拟沙柱坍塌

本博客使用开源软件Anura3D软件模拟了一个沙柱坍塌的过程,这个软件是基于基于物质点法(MPM)设计的

weixin_59902634的博客 4043

Laravel控制器简单总结

控制器一般存储在app/controllers目录下,所有的控制器都要继承BaseController类。BaseController类也存储在app\controllers下,通常用来放置公用的控制器逻辑。BaseController 类继承自框架的Controller 类。在终端新建控制器和指定操作: php artisan controller:make PostController --o

宋子庆的博客 1596

数据中心机房建设标准及依据

深刻理解、尊重并恪守这些依据,是我们以科学、经济、可靠的方式,为蓬勃发展的数字经济筑牢基石的唯一路径。让我们共同努力,以标准为依据,以匠心为精神,建造更多世界一流的高效能、高可用、高智能的绿色数据中心,共同赋能数字中国的宏伟事业,支撑中华民族在数字时代的伟大复兴征程中稳步前行!今天我将力图以宏大的视角和深入的剖析,系统性地阐述数据中心机房建设所应遵循的多层次、多维度的标准依据,揭示这些依据背后的深层逻辑与时代使命,并探讨其如何共同作用于一座世界级数据中心的诞生。,以支持万兆乃至更高速率的传输。

qq_39980997的博客 1139

Controller(一)

一、Controller是什么? 顾名思义,Controller就是控制器。它是玩家在游戏中的一个代理对象,也是玩家与游戏中人物或者AI之间的交互的桥梁。它的任务就是掌管人物或AI的所有行为。可以说Controller将人物和AI玩弄于股掌之间。 Controller是派生自Actor,所以它理所当然具有Actor的基本属性Tansform,这使得Controller具有存在于游戏Level中的能力;具有序列化功能,这在根类UObject中有实现;具有网络复制功能,赋予了...

刀客 1万+

2024年最新双摄像头的实时视频拼接及目标跟踪(一)_监控视频拼接实时(1),网络相关+C C++三方库的源码分析+数据结构与算法

opencv中采用了SURF,ORB进行特征点提取,如果装的是opencv2.0版本,则可以直接用SURF,如果是3.0版本,则需要下载相应的contrib库进行安装。原理不赘述,给出其实验结果对比和分析,原始图像1SURF特征点提取网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化的资料的朋友,可以添加戳这里获取一个人可以走的很快,但一群人才能走的更远!

m0_51437227的博客 937

Controller 就该这么写

从统一返回结构到参数校验再到异常处理等方面改造Controller层,想写出优雅简洁的Controller逻辑,不要错过这篇文章

gelald的博客 1456

【测绘程序设计】——潮汐调和分析

最小二乘潮汐调和分析源码、使用示例及数据

C_xxy's blog 2652

Laravel 控制器 Controller 传值到 视图 View 的几种方法总结

单个值的传递 with public function index() { $test = "测试"; return view('test.index')->with('test',$test); } view public function index() { return view('test.index', ['test' => '测试...

weixin_30481087的博客 1261

Oracle EBS Interface/API(49)- AP付款取消API

Oracle EBS AP付款取消API介绍和简单实例

陈显平的专栏-Oracle EBS 850

基于STM32、HAL库的SC16IS752IPW总线转UART驱动程序设计

/ FIFO空间不足。// 设置LCR寄存器的DLAB位为1以访问DLL/DLH。// 设置LCR寄存器,先访问DLL/DLH。// 设置LCR寄存器(不包含DLAB位)

corlin6688的博客 817

laravel controller

一、准备工作 在routes/web.php中创建一个路由,如下 Route::get('/', function() { return view('welcome'); }); Route::get('user/name',function () { return 'Name page'; }); 当访问网址localhost/user/name时,会出现如下页面 ...

u012160319的专栏 945

Unity插件NodeCanvas之行为树的详细教程

NodeCanvas 是一个用于 Unity 的可视化脚本工具,主要用于游戏开发中的行为树、状态机和流程图的设计。它通过节点编辑器的方式,让开发者可以更直观地创建和管理游戏逻辑,减少了传统编码的复杂性。今天我们就来详细介绍一下NodeCanvas插件。

TxNet 1958

PHP Laravel 5.2 中文文档:HTTP控制器Controller

如果你的应用完全基于控制器路由,可以使用 Laravel 的路由缓存,使用路由缓存将会极大减少注册所有应用路由所花费的时间开销,在某些案例中,路由注册速度甚至能提高100倍!Laravel 的资源控制器使得构建围绕资源的 RESTful 控制器变得毫无痛苦,例如,你可能想要在应用中创建一个控制器,用于处理关于图片存储的 HTTP 请求,使用 Artisan 命令。除了构造函数注入之外,还可以在控制器的动作方法中进行依赖的类型提示,例如,我们可以在某个方法中类型提示。因此,如果你的完整控制器类是。

学亮编程手记 948

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

laravel学习(三)-----控制器Controller

路由器的部分会指向Controller,下面学习Controller相关知识 artisan命令自动生成controller文件 php artisan make:controller /Contro/Foo1Controller 在路由中添加中间件 public function __construct() { //添加中间件 // $this-...

Wu_ye123的博客 626

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

laravel框架上传图片实时预览

在laravel框架中上传图片并实时预览,其实并没有那么难,下面给大家展示一下;

q459691431的博客 3039

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

laravel笔记-控制器

laravel笔记-控制器写在前面时间可贵,善用目录↑学习Laravel的笔记,仅仅是作为laravel文档笔记,目的是强化对文档的理解,质量不高。什么是控制器(Controller) 将相关的 HTTP 请求封装到一个类中进行处理。通常控制器存放在 app/Http/Controllers 目录中。 继承App\Http\Controllers\Controller控制器嘛,起一个控制调度的作

Clew123的博客 546

laravel框架实现一个简单网站的思路

1配置好环境,使用make:auth,完成好网站的基本注册登录功能. 2.在访问网站的页面的时候,一个网站的头部和尾部都是相同的,就可以利用blade模板继承,将头部和尾部提出来,在写的页面中,include头部和尾部. 3.实现上传视频功能,创建模型(model): art make:model -m Video    创建控制器 art make:controller VideoCont

xiaoqingxinxin的博客 1526

laravel创建控制器,模型层,迁移数据库

laravel通过命令来创建控制器,模型层,及迁移数据库: 首先,通过cmd进入laravel框架中,如图所示,只是集成环境不同,只要访问到laravel框架就可以。 示例: 访问到目录以后,就可以执行命令了。 创建控制器:php artisan make:controller 控制器名称(采用驼峰命名) 创建控制器:php artisan make:controller 控制器名称(采用驼峰命...

qq_45192703的博客 678

php 控制器动作,Laravel资源控制器处理的动作

D:\hwamp\Apache24\htdocs\laravel\my_laravel>php artisan route:list+--------+-------------------------------------------------------------------------------------------------------------------------...

weixin_42662293的博客 282

Laravel5.3初步使用三(View层、Controller层)

一、View层1.前端制作好一些静态的文件,存放在public文件夹中,这些文件包括图片、js、css等 2.利用前端做好的页面,即html文件的代码,制作 *.blade.php模板页面或者普通php页面3.当多个页面有相同的布局,比如分上中下,上部导航栏和底部网页信息栏在多个页面都差不多,只有中间内容页更改的情况下,我们可以做一个模板页,在View文件夹下新建一个**Common的文件夹 源

My设计Road 4394

laravel-admin以及wangeditor扩展的安装

laravel-admin以及wangeditor扩展的安装 PHP版本 7.2.24 Laravel 版本 7.30.4 首先确保安装好了lnmp环境已经laravel框架。 第一步,安装laravel-admin扩展。 分别在laravel项目跟目录执行下面的三行代码: composer require encore/laravel-admin:1.* php artisan vendor:publish --provider=“Encore\Admin\AdminServiceProvider” ph

mengliwang的博客 1319

Laravel5.2目录结构及composer.json文件解析

Laravel5.2目录结构及composer.json文件解析       目录或文件 说明 |– app 包含Controller、Model、路由等在内的应用目录,大部分业务将在该目录下进行 |  |– Console 命令行程序目录 |  |  |– Commands 包含了用于命令行执行的类,可在该目录下自定义类 |  |  |...

狂奔的蜗牛 966

laravel 生成验证码的方法

在Laravel中有很多图片验证码的库可以使用,本篇介绍其中之一:gregwar/captcha,这个库比较简单,在Laravel中比较常用。下面我们就来介绍下使用细节: 首先, composer.json中如下加入配置: "require": { ... "gregwar/captcha": "1.*" }, 然后,已成习惯的命令:用cmd执

幻羽公子的博客 1119

Laravel5.3使用学习笔记---控制器

看完了laravel V5.3的路由和中间件部分,接着就是看控制器部分了。 参考官方英文文档,laravel 5.3控制器部分: https://laravel-china.org/docs/en/5.3/controllers一. 控制器的定义和基本路由访问 定义一个控制器相当简单,结合PSR规则,在App\Http\Controllers路径下,新建TestController.php文件,

Gavin_new的博客 2214

Laravel 5.1 Ajax上传图片方法

最近在做的项目基于Laravel 5.1开发,需要用到Ajax上传,查了些资料,自己整理了下可用的方法。 控制器: UploadController.php <?php namespace App\Http\Controllers\Admin; use App\Http\Requests; use App\Http\Contro...

weixin_34283445的博客 159
上一篇: xampp apache建立虚拟目录
下一篇: laravel框架下使用phpunit出现Fatal error: Cannot redeclare xxxx() (previously declared in...错误的解决
ipip2005
博客等级 码龄17年 100粉丝 20原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值