那为什么最近又动了写 Blogs 的心思,原因是最近读了一本书,书名是:《软技能:代码之外的生存指南》,里面第二篇:自我营销中讲到程序员自我营销的重要性,其中一点就提到了写 Blogs。 总结来说,程序员写写 Blogs 不仅是自我营销的一种方式,还是一种很好的学习方式,不是说知识能说出来才算学到了么。 Jekyll & GitHub Pages 自我总结一下,之前没有坚持下来很大一个原因就是一个字:“懒”,再加上之前的那些 Blogs 系统多多少少会有点不足。 我也曾经尝试过购买 VPS 主机,自己搭建 Blogs,我甚至还为之购买了域名,可是后来发现,为何 VPS 是何等的费时费力。 一个典型的 Jekyll Blogs 的目录结构应该如下面所示: .├── _config.yml├── _drafts| ├── begin-with-the-crazy-ideas.textile
/blogs2/2 { "title": "2跟石杉老师学ES", "content": "2-second blog", "userInfo": { "userId": 2, "username": "2小工匠" } } PUT /blogs2/blogs2/3 { "title": "3跟石杉老师学ES", "content": "3-second blog ", "userInfo": { "userId": 3, "username": "3小工匠" } } PUT /blogs2/blogs2/4 { "title" "username": "2小工匠" } } PUT /blogs2/blogs2/6 { "title": "6跟石杉老师学ES", "content": "6-second blog" , "userInfo": { "userId": 3, "username": "3小工匠" } } PUT /blogs2/blogs2/7 { "title": "7
= context.Blogs.ToList(); //获取单个实体 var blog = context.Blogs.Single(b => b.BlogId == 1); //筛选 var blogs 例如: using (var context = new BloggingContext()) { var blogs = context.Blogs .Include(blog : using (var context = new BloggingContext()) { var blogs = context.Blogs .Include(blog = 例如: using (var context = new BloggingContext()) { var blogs = context.Blogs .Include(blog 原始SQL语句: var blogs = context.Blogs .FromSql("SELECT * FROM dbo.Blogs") .ToList(); 存储过程: var blogs
(blogs): """处理从博客园获取到的随笔数据""" new_data = None if blogs: new_data = { ,如2022-09-07) "ViewCount": blogs["ViewCount"], # 浏览次数 "CommentCount": blogs[ def get_blogs_api(self, blog_name): """获取个人随笔列表接口""" flag = True try: blogs = [ )) # print(blogs) # print("123") new_blogs = list(map(self.deal_blogs, blogs) ,结束循环 # print(data) flag = False new_blogs = list(map(self.deal_blogs, blogs
/Ron.Blogs.csproj", "src/Ron.Blogs/"] RUN dotnet restore "src/Ron.Blogs/Ron.Blogs.csproj" COPY . . /src 开始,如果我们直接执行 docker build ,会提示找不到该项目文件 src/Ron.Blogs/Ron.Blogs.csproj,正确的解决方法是将Dockerfile文件移动到src 输入下面的脚本 docker build -t blogs . docker run --rm -d --name blogs -p 15002:80 blogs echo "success" 就这样 注意事项 上面的脚本在第一次运行的时候没有问题,但是在第二次构建的时候,将会提示实例名称 blogs 已存在,我们需要修改一下构建脚本,加入 docker stop blogs docker build -t blogs . docker stop blogs docker run --rm -d --name blogs -p 15002:80 blogs echo "success" 结束语 上面就是本次的快速拥抱
(page=p, blogs=blogs) 管理页面: @get('/manage/blogs') def manage_blogs(*, page='1'): return { /api/blogs? (blog) { location.assign('/manage/blogs/edit? 数组中增加一个Blog元素,table就神奇地增加了一行;把blogs数组的某个元素删除,table就神奇地减少了一行。 可以把v-repeat="blog: blogs"看成循环代码,所以,可以在一个
> blogs; private ArrayList<Blogs> dataBlogs; private BlogsAdapter adapter5; private Col_BlogsDao > blogs=new ArrayList<Blogs>(); private RequestQueue mQueue; private ImageLoader mImageLoader; (blogs.get(position).getTitle()); hodler.tv_summary.setText(" "+blogs.get(position).getSummary( 主页:"+blogs.get(position).getAuthorUri()); hodler.tv_diggs.setText(String.valueOf(blogs.get(position (String.valueOf(blogs.get(position).getViews())); hodler.tv_postid.setText(String.valueOf(blogs.get
= list(map(self.deal_blogs, blogs)) # 调用map函数处理博客原始数据 first_blog = new_blogs[-1] # 发布的第一篇博客 sort_blogs = sorted(new_blogs, key=lambda item: item["ViewCount"], reverse=True) # 按照 (self, name): data = self.get_blogs_api(name) # print(data) set_redis_data("blogs_data", ["cn_blogs"]["blogApp"] # request.args.get("blog_app") data = r.get("blogs_data") if data is None: # 如果从redis读取到空,说明key失效了,此时调用save_blogs()方法,重新向redis写入数据 cn_blogs.save_blogs
public class BlogsController { @Resource private BlogsService blogsService; /** * 添加Blogs * * @param blogs 对象 * @return ResultModel统一响应结果 */ @PostMapping("add") @ ResponseBody public ResultModel add(Blogs blogs) { blogsService.insert(blogs); return ") @ResponseBody public ResultModel update(Blogs blogs) { blogsService.updateById(blogs blogs = blogsService.selectById(id); return ResultModel.success(blogs); } /**
(),使用@async_fun装饰这个方法, @async_fun def get_blogs_api(self, blog_name): """获取个人随笔列表接口"" 4、flask接口方法中,调用get_blogs()和get_blogs_api() class GetBlogs(Resource): """接口:获取个人随笔列表""" @staticmethod def get(): blog_app = cn_blogs.conf["cn_blogs"]["blogApp"] # request.args.get("blog_app ") cn_blogs.get_blogs_api(blog_app) # 先调用向文件写入数据的方法 res = cn_blogs.get_blogs() # 调用读取文件数据的方法 return res 实际运行时,前端调用这个flask接口后,会立刻得到数据, 不用等待get_blogs_api()执行成功 因为get_blogs_api()会异步执行,运行成功后把从博客园接口获取到新数据再写入文件
现在我们在app/conf/routes这个文件中增加一个路由GET /blogs Blogs.Blogs ? 保存。在views目录下创建blogs目录并在其下创建blogs.html文件。 Blogs struct { *revel.Controller } func (c Blogs) Blogs() revel.Result { return c.Render() } 也就是说,如果我们没有添加任何的路由,只用这个默认的生成的路由也是可以访问到blogs的。可以试一下,在浏览器访问localhost:9000/blogs/blogs。 后面的一个blogs对应的就是controller的action也就是Blogs结构的Blogs方法。 controller的数据如何能传给模板呢。 为
下面是一些常用SQL操作及其在EF Core中的对应实现方式:SQL操作EF Core实现示例SELECTLINQ查询var result = context.Blogs.Select(b => new { b.Id, b.Name }).ToList();WHERELINQ Wherevar filtered = context.Blogs.Where(b => b.IsActive).ToList ();ORDER BYLINQ OrderBy/ThenByvar ordered = context.Blogs.OrderBy(b => b.Name).ThenBy(b => b.Id).ToList ();GROUP BYLINQ GroupByvar grouped = context.Blogs.GroupBy(b => b.Category).Select(g => new { Category )LINQ Aggregate Functionsvar count = context.Blogs.Count(); var maxId = context.Blogs.Max(b => b.Id);
///
php class Blogs extends CI_Controller { public function view($page = 'home') { // if ( 'views/blogs/' . > 二、model:application/models/Blogs_model.php <? php class Blogs_model extends CI_Model { public function __construct() { this->load > //待完善 三、view:application/views/blogs/home.php
所以这个时候就需要使用模块化命名 像这个如果触发一个 mutations 因为他们两个名字相同,所以就会同时触发两个 为了解决上面这中问题就需要在子模块中启用命名空间 // 启用命名空间 export const blogs = { // 开启命名空间 namespaced: true } // 调用的时候就是 // 这里的 blogs 是子模块导出的命名 this. $store.commit('blogs/add') 二、防止命名冲突 通过开启命名空间就可以防止重复命名的冲突,但是在使用的时候又麻烦了,都需要加上前缀 blogs/xxx,为了解决上面这种问题,mapState export default { computed: { // 第一种写法 这样访问的时候在模板中要加 / 就不好访问 但是不带命名空间的还是可以直接放在里面 ...mapState(['blogs /add']) // 第二种写法, 第一个参数传递空间名字,第二个参数个数据,放的是空间里面的 state ...mapState('blogs', ['add']) } } </
创建 blogs_index 和 tags_index(就是tag的详情): PUT /blogs_index { "settings": { "index": { "number_of_shards POST /blogs_index/_doc/_search { "query": { "term" : { "title" : "关注我,系统学编程" } } } 语句2:只检索关键词 “编程”,可以检索文档1和文档2 POST /blogs_index/_doc/_search { "query": { "term" : { "title" : "编程" } } } match 语句1:检索文档1的title字段的完整内容,得到文档1和文档2; POST /blogs_index/_doc/_search { "query": { "match" : { 比如说我们这个blogs_index中的author字段,假如我们只想看作者为“方才兄”的blog,DSL语句如下: POST /blogs_index/_doc/_search { "query"
BloggingContext(); using var transaction = context.Database.BeginTransaction(); try { context.Blogs.Add (new Blog { Url = "http://blogs.msdn.com/dotnet" }); context.SaveChanges(); context.Blogs.Add (new Blog { Url = "http://blogs.msdn.com/visualstudio" }); context.SaveChanges(); var blogs = context.Blogs .OrderBy(b => b.Url) .ToList(); // Commit transaction if all commands
= "Pages.Blogs"; public const string Pages_Blogs_Notes = "Pages.Blogs.Notes"; public const string Blogs_Notes_Edit = "Pages.Blogs.Notes.Edit"; public const string Blogs_Notes_Delete = "Pages.Blogs.Notes.Delete"; } public class MZCAuthorizationProvider : AuthorizationProvider , L("Blogs")); var NotePermission = BlogPermission.CreateChildPermission(PermissionNames.Pages_Blogs_Notes ")); NotePermission.CreateChildPermission(PermissionNames.Blogs_Notes_Delete, L("DeleteNotes
现在代码,初始化工程,添加依赖 # 下载代码 git clone https://gitee.com/lzugis15/lzugis-blogs.git # 进入目录 cd lzugis-blogs # 添加运行脚本 修改package.json并添加运行脚本 { "name": "lzugis-blogs", "version": "1.0.0", "description": "gn", 添加博客内容 在docs目录下创建blogs目录,并添加如下文件 3. '项目实战', link: '/blogs/project'}, {text: '高级进阶', link: '/blogs/more'}, 本文的示例访问地址:https://lzugis15.gitee.io/lzugis-blogs
web.HTTPFound('/signin') return (yield from handler(request)) return auth 后端API包括: 获取日志:GET /api/blogs 创建日志:POST /api/blogs 修改日志:POST /api/blogs/:blog_id 删除日志:POST /api/blogs/:blog_id/delete 获取评论:GET /api /comments 创建评论:POST /api/blogs/:blog_id/comments 删除评论:POST /api/comments/:comment_id/delete 创建新用户:POST /api/users 获取用户:GET /api/users 管理页面包括: 评论列表页:GET /manage/comments 日志列表页:GET /manage/blogs 创建日志页:GET /manage/blogs/create 修改日志页:GET /manage/blogs/ 用户列表页:GET /manage/users 用户浏览页面包括: 注册页:GET /register 登录页