• 第7章 博客文章的前端渲染显示


    说实话本人通过Vue页面实现前端对后端数据的渲染显示也是初学咋练,但后端实现本人却是老鸟,对于后端开发者来说如果,渲染显示的软件是浏览器,除非团队中有Vue方面的大拿,不管是PC浏览器还是移动PC浏览器,Razor页面是最好的选择; 如果是通过App或小程序进行渲染显示那么Vue是必需且唯一的选择。

        Vue页面的实现不管是语言还是开发环境当前都于处于急剧迭代的阶段,即它们都还不成熟,1年前的前端项目不能被运行是常态,因此建议最好集成当前最新的开发包,这样也许前端项目的运行兼容周期会长一些,这也是本人建议如果是浏览器就选择Razor页面的主要原因之一

        由于上述因素在开发开发环境:VSCode与Hbuilder X,的选择是准则是:小孩才作选择,大人全都要;这是向现实认命和妥协,只有在两个者能够明显分出高下的时候,才是开者才能作出最终的选择。

        VSCode:能够获取最新的Vue包,但上手和配置比较麻烦,特别对于App或小程序的uni-app尤其此。

        Hbuilder X:所支持Vue包的最新版本是:3.28,但当前Vue的最新包最新版本是:5.x,但Hbuilder X最大的优点是上手简单,特别对于App或小程序的uni-app开发,除非特别需求,建议还是直接选择Hbuilder X。

        “Blog.Admin-master”前端项目是最终用于浏览器渲染显示的,它的开发环境是“VSCode”,所以本人也会遵循上述要求对“Blog.Admin-master”前端项目进行分解实现,由于本人“VSCode”中所配置的Vue包版本比较高导致原项目不能被正常运行,所以本从前端项项目代码可能与考“Blog.Admin-master”前端项目的代码有些不同敬请谅解。

    1 跨域(Cors)异常的后端解决方案

        在当前Vue前端项目中对后端的访问中会异常:“has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.”,如下图所示:

    1.1 异常解决方案

    1.1.1 定义中间件“CorsMiddleware”

    namespace WebApi.Middleware

    {

        ///

        /// 【跨域访问中间件】

        ///

        ///

        /// 摘要:

        ///     该管道中间件类主要为了解决在由vue/uni-app前端项目(Cors)访问当前后端项目时,浏览器或App中出现的异常:

        ///    1、“has been blocked by CORS policy: Request header field content-type is not allowed by Access-Control-Allow-Headers in preflight response.”。

        ///    2、“has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.”。

        ///

        public class CorsMiddleware

        {

            #region 拷贝构造方法

            ///

            /// 【下1个】

            ///

            ///

            /// 摘要:

            ///     .Net(Core)框架内置管道中的下1个管道中间件实例。

            ///

            private readonly RequestDelegate _next;

            /// name="next">.Net(Core)框架内置管道中的下1个管道中间件实例。

            ///

            /// 【拷贝构造方法】

            ///

            ///

            /// 摘要:

            ///    通过该构造方法中的参数实例,实例化.Net(Core)框架内置管道中的下1个管道中间件实例。

            ///

            public CorsMiddleware(RequestDelegate next)

            {

                _next = next;

            }

            #endregion

            #region 方法

            /// name="context">HTTP上下文实例。

            ///

            /// 【调用】

            ///

            ///

            /// 摘要:

            ///    通过该方法向.Net(Core)框架内置管道中集成当前管道中间件,解决由vue/uni-app前端项目(Cors)访问当前后端项目时,浏览器或App中出现的异常:

            ///    1、“has been blocked by CORS policy: Request header field content-type is not allowed by Access-Control-Allow-Headers in preflight response.”。

            ///    2、“has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.”。

            ///

            public async Task Invoke(HttpContext context)

            {

                //解决在由Hbuilder创建的前端Xuni-app项目(Cors)访问当前后端项目时,浏览器或App中会出现异常:

                //“has been blocked by CORS policy: Request header field content-type is not allowed by Access-Control-Allow-Headers in preflight response.”。

                if (!context.Response.Headers.ContainsKey("Access-Control-Allow-Headers"))

                {

                    context.Response.Headers.Add("Access-Control-Allow-Headers", "DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization");

                }

                if (!context.Response.Headers.ContainsKey("Access-Control-Allow-Methods"))

                {

                    context.Response.Headers.Add("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,PATCH,OPTIONS");

                }

                //解决在由Hbuilder创建的前端Xuni-app项目(Cors)访问当前后端项目时,浏览器或App中会出现异常:

                //“has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.”。

                if (!context.Response.Headers.ContainsKey("Access-Control-Allow-Origin"))

                {

                    context.Response.Headers.Add("Access-Control-Allow-Origin", "*");

                }

                await _next(context);

            }

            #endregion

        }

    1.1.2 重构 Program类

    var app = builder.Build();

    //把自定义管道中间中集成到.Net(Core)框架内置管道中,解决vue/uni-app前端项目(Cors)访问当前后端项目时,浏览器或App中出现的异常:

    //    1、“has been blocked by CORS policy: Request header field content-type is not allowed by Access-Control-Allow-Headers in preflight response.”。

    //    2、“has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.”。

    app.UseMiddleware();

    // Configure the HTTP request pipeline.

    if (app.Environment.IsDevelopment())

    {

        app.UseSwagger();

        app.UseSwaggerUI();

    }

    app.UseHttpsRedirection();

    1.1.3 启动程序

        .net框架可以在不经过部署,直接在执行的情况下让前端项目直接访问后端项目,按F5启动程序,如下图所示:

    2 博客文章的前端实现

    2.1 “element-plus”模板插件的导入与配置

    2.1.1 “element-plus”导入命令:

        npm install element-plus

    2.1.2  “element-plus”配置:

    “main.js”文件中定义如下配置:

    import { createApp } from 'vue'

    //“element-plus”模板插件【导入】为全局变量:“ElementPlus”

    import ElementPlus from 'element-plus'

    import 'element-plus/dist/index.css'

    import App from './App.vue'

    import router from './router'

    import store from './store'

    createApp(App)

        .use(store)

        .use(router)

        // 使全局变量:“ElementPlus”,在所有的*.vue页面中都有效。

        .use(ElementPlus)

        .mount('#app')

     2.2 axios路由组件导入命令:

        npm install axios

    3 “BlogsView.vue”页面与路由

    3.1 定义BlogsView.vue”页面

         

          prop="createTime" label="创建时间" :formatter="formatCreateTime" width="250" sortable>

          >

       

    scoped>

    .custom-tbl /deep/ .has-gutter .el-checkbox {

      display: none;

    }

    注意:

    1. 在方法定义时最好使用异步方法,同步方法会造成执行穿透,从而产生逻辑异常,常见现象是:第1个同步方法依赖于第2个同步方法的实例值,但由于第2个同步方法,还没有执行完成,第1个同步方法就会直接把默认值渲染显示在页面上。
    2. JavaScript代码是选项式APIOptions API,这是vue2中的定义方式;vue3中提倡使用组合式api(composition API),两种定义方式在1个项目中可以混用,但在基于vue3项目中最好以组合式api(composition API)为主,如果可能最好只使用这种定义方式,由于本人水平和当前项目所以使用了选项式APIOptions API)。

    3.2 “BlogsView.vue”页面的路由定义

    “router\index.js”文件中定义如下配置:

    {

        path: '/about',

        name: 'about',

        component: () => import('../views/AboutView.vue')

      },

      {

        path: '/Blog/Blogs',

        name: '博客管理',

        component: () => import('../views/Blog/BlogsView.vue'),

        meta: {

          title: '博客管理',

        }

      }

    ]

    const router = createRouter({

      history: createWebHashHistory(),

      routes,

    })

    router.beforeEach(async (to) => {

      // 如果路由中有标题实例,而把标题渲染显示在标签上。

      if (to.meta.title) {

        document.title = to.meta.title;

      }

    });

    注意:

        在当前版本的Vue中路由的名称不能与*.vue页面的名称一样,例如:Blogs就与BlogsView.vue不同。

    执行前端项目如下图所示:

    对以上功能更为具体实现和注释见:221128_001_admin(BlogsView页面绑定渲染数据)。

  • 相关阅读:
    HTTPS的理解(证书、认证方式、TLS握手)
    力扣每日一题 ---- 2905. 找出满足差值条件的下标 II
    在uniapp中通过自定义事件使页面之间传递数据
    Win10怎么设置不进入屏保也不关闭显示器
    共谋韬略、共巢未来,电巢与韬略“战略合作签约仪式”圆满举办!
    【网络安全专栏目录】--企鹅专栏导航
    OpenAI即将推出新一代AI模型DALL-E 3;用AI进行天然产物药物发现的综述
    六 系统可靠性分析与设计
    企业什么时候上线CRM最好?
    神经网络滤镜安装教程图,ps神经网络滤镜安装包
  • 原文地址:https://blog.csdn.net/zhoujian_911/article/details/128086159