第5章 uin-app本地主机数据跨域(Cors)数据交互实现

article/2025/8/17 14:54:19

开发前端App最先需要被实现的功能是:与本地主机上已经布置在IIS服务上的后端数据实现跨域(Cores)交互操作,这也是前端App作为前端工程性项目存在的根本意义和需求,因此需要首先对上一章中示例:22-09-24-04_uniAppVue3(初识HbuilderX之前移动前端App开发)进行重构,把网络后端数据实现跨域(Cores)交互实现重构为本地主机数据实现跨域(Cores)交互实现。

1 重构前端项目

1.1 重构main.js文件中的根域名为本地主机域名

//设置后端服务的根域名,“https://api-hmugo-web.itheima.net”可以提供JSON格式的数据,以供程序测试使用,本人以验证该后端服务能够提供数据。

//也可以把该根域名修改为自己,通过IIS部署的根域名例如:“http://localhost:8080”

$http.baseUrl = 'http://localhost:8080'

1.2 重构pages\index\index.vue视图文件中的根域名为本地主机域名

<template>

    <view class="content">

         <view v-for="(list,index) in list" :key='index'>

                    编号:{{list.id}}角色名:{{list.roleName}}说明:{{list.description}}创建时间:{{list.createTime}}状态:{{list.enable}}

        </view>

    </view>

</template>

<script>

    export default

    {

        data()

        {

            return {

                title: 'Hello',

                list: [],//1步:声明数据局部变量,用于存储从服务器端获取的数据。

            }

        },

        onLoad()

        {

            //3步:如果vue视图页面绑定有从指定方法获取的数据,则在vue视图页面渲染显示前,通过指定方法获取数据,为vue视图页面渲染显示提供数据支撑。

            this.getFloorList();

        },

        methods:

        {

            //2步:通过调用相对路由(“/api/public/v1/home/swiperdata”),获取该服务端控制器方法中的数据,并打印。

            //注意:该相对路由(“/api/public/v1/home/swiperdata”)的绝对路由是:“https://api-hmugo-web.itheima.net/api/public/v1/home/swiperdata”

            //注意:该相对路由(“/role/get”)的绝对路由是:“http://localhost:8080/role/get”

            async getFloorList()

            {

                //根据绝对路由在浏览器中的JSON编码格式的数据,重构“const”变量。

                const {data:{status,response}} = await uni.$http.get('/role/get');

                console.log(status);

                if(status !== 200)

                    return uni.$showMsg();

                this.list= response.data;

                console.log(this.list);

            },

        }

    }

</script>

1.3 错误异常的执行结果

       在重构完成后执行项目浏览器控制台中会显示错误异常信息:“Access to XMLHttpRequest at 'http://localhost:8080/role/get' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.”,效果如下图所示:

2 重构后端项目

    上述异常有两种解决方案:

  1. 通过向浏览器中安装指定的插件,参考:“(1条消息) 解决跨域问题:Access to XMLHttpRequest at ‘http://localhost:8080/xxx‘ No ‘Access-Control-Allow-Origin‘ head_一觉睡过头的菜鸡的博客-CSDN博客_access to xmlhttprequest”,这种解决方案本人未测试。
  2. 重构后端项目:“22-09-22-02_UserVue(Vue服务器(后)端Swagger定义实现与发布部署)”

2.1 自定义管道中间件类:CorsMiddleware

/// <summary>

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

    /// </summary>

    /// <remarks>

    /// 摘要:

    ///     该管道中间件类主要为了解决在前端uni-app项目跨域访问当前后端项目时,浏览器或App中会出现异常信息:

    /// “Access to XMLHttpRequest at 'http://localhost:8080/role/get' from origin 'http://localhost:3000' has been blocked by CORS policy:

    /// No 'Access-Control-Allow-Origin' header is present on the requested resource.”,从而导致前端uni-app项目不能与当前后端项目跨域的数据交互操作。

    /// </remarks>

    public class CorsMiddleware

    {

        #region 拷贝构造方法

        /// <summary>

        /// 【下1个】

        /// </summary>

        /// <remarks>

        /// 摘要:

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

        /// </remarks>

        private readonly RequestDelegate _next;

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

        /// <summary>

        /// 【拷贝构造方法】

        /// </summary>

        /// <remarks>

        /// 摘要:

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

        /// </remarks>

        public CorsMiddleware(RequestDelegate next)

        {

            _next = next;

        }

        #endregion

        #region 方法

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

        /// <summary>

        /// 【调用】

        /// </summary>

        /// <remarks>

        /// 摘要:

        ///    通过该方法向.Net(Core)框架内置管道中集成当前管道中间件,从而解决指定错误异常:

        ///“Access to XMLHttpRequest at 'http://localhost:8080/role/get' from origin 'http://localhost:3000' has been blocked by CORS policy:

        /// No 'Access-Control-Allow-Origin' header is present on the requested resource.”,从而导致前端uni-app项目不能与当前后端项目跨域。

        ///    最后如果.Net(Core)框架内置管道中在当前管道中间件之后,还有其它管道中间件被集成在.Net(Core)框架内置管道中,则.Net(Core)框架内置管道中继续向下执行下1个管道中间件。

        /// </remarks>

        public async Task Invoke(HttpContext context)

        {

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

            {

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

            }

            await _next(context);

        }

        #endregion

    }

2.2 重构 Program.cs

var app = builder.Build();

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

// “Access to XMLHttpRequest at 'http://localhost:8080/role/get' from origin 'http://localhost:3000' has been blocked by CORS policy:

// No 'Access-Control-Allow-Origin' header is present on the requested resource.”,从而导致前端uni-app项目不能与当前后端项目跨域的数据交互操作。

app.UseMiddleware<CorsMiddleware>();

2.3 重新对后端项目进行发布部署

   关于后端项目必须在最后进行发布部署操作,并通过IIS配置相应的网站,请查看本人的文章:“https://blog.csdn.net/zhoujian_911/article/details/126864660”。

2.4 部署完成后前端的执行结果

对以上功能更为具体实现和注释见:22-09-25-05_UserVue( uin-app本地主机数据跨域(Cors)数据交互实现之--后端)。

3 通过第3方组件速构建vue视图页面。

    uin-app的vue视图页面中所包含的内置标签极少,为了页面的渲染显示需要开发者通过遵循自定义组件的方式,把组件实例化为自定义标签,添加到指定的vue视图页面中,从而实现vue视图以多种形式对绑定的数据进行渲染显示。

    实际上<table>及其相关标签,uin-app的vue视图页面内置标签中就是存在的,因此如果需要把绑定数据,以table样式渲染显示则需要通过遵循自定义组件的方式来实现,但为了速构建vue视图页面,HbuilderX为我们提供了另外一种好的选择,在项目中大量导入第3方组件,下面将通过“uni-table 表格”和“uni-tag 标签”组件的导入为示例,讲述怎样在项目通过导入第3方组件,来快速构建vue视图页面。

3.1 准备工作

    “uni-table 表格”第3方组件导入地址:uni-table 表格 - DCloud 插件市场。

    “uni-tag 标签”第3方组件导入地址:uni-tag 标签 - DCloud 插件市场。

3.1.1 为HbuilderX安装插件:“uniModules插件”

    HbuilderX在为项目导入第3方组件时首先需要为HbuilderX开发环境安装“uniModules插件”,否则就会在导入时出现错误信息:“当前操作依赖插件【uni_modules】,请安装后再试”,如下图所示: 

出现上述错误的原因有两个:

  1. 已安装了“uniModules插件”,但未在HbuilderX开发环境生效。

这种方式的解决方案是:先关闭HbuilderX开发环境后,再打开HbuilderX开发环境,已安装了“uniModules插件”,即可生效。

2、HbuilderX开发环境未安装“uniModules插件”,下面将讲述“uniModules插件”的安装,安装步骤如下图所示:

查看是否是HbuilderX开发环境已经安装“uniModules插件”,但未生效。

       为HbuilderX开发环境已经安装“uniModules插件”,注意:安装完成后,要立即关闭HbuilderX开发环境后,再打HbuilderX开发环境,以防止上述错误的产生。

3.2 为当前项目导入第3方组件:“uni-table 表格”

3.2.1 打开网址:“uni-table 表格 - DCloud 插件市场

3.2.2 导入后在项目中自动添加“Uni_modules”文件夹及其子文件夹和文件

    “Uni_modules”文件夹中的子文件夹可分为:公共组件和特定组件,为什么要这样分类,这将在“uni-tag 标签”第3方组件导入操作中进行说明,如下图所示:

3.3 为当前项目导入第3方组件:“uni-tag 标签”

    同上打开地址:uni-tag 标签 - DCloud 插件市场。,点击页面上的插件导入按钮。

    在为当前项目导入第3方组件:“uni-tag 标签”时,因为上面已经导入了“uni-table 表格”组件,HbuilderX会弹出“文件内容对比合并”对话框,让开发者进行文件的对比合并,如果你不是对你所导入的所有组件的依赖文件都十分的了解,则最好先取消该对话框中的所有公共组件复选框中的选择,再点击“合并”按钮,这也是我把子文件夹分为:公共组件和特定组件的主要原因,如下图所示。

将“uni-tag 标签”第3方组件导入项目,如下图所示:

3.4 最终形态的pages\index\index.vue视图文件

<template>

    <view>

        <view class="uni-container">

            <uni-table ref="table" border stripe type="selection" emptyText="暂无更多数据">

                <uni-tr>

                    <uni-th width="150" align="center">编号</uni-th>

                    <uni-th width="150" align="center">角色名</uni-th>

                    <uni-th width="150" align="center">说明</uni-th>

                    <uni-th width="150" align="center">创建时间</uni-th>

                    <uni-th width="150" align="center">状态</uni-th>

                </uni-tr>

                <uni-tr v-for="(item, index) in list" :key="index">

                    <uni-td>{{ item.id }}</uni-td>

                    <uni-td>

                        <view class="name">{{ item.roleName }}</view>

                    </uni-td>

                    <uni-td align="center">{{ item.description }}</uni-td>

                    <uni-td align="center">

                        <view v-if="item.createTime">{{ dateFormat(item.createTime) }}</view>

                    </uni-td>

                    <uni-td align="center">

                        <view v-if="item.enabled">

                            <uni-tag text="启用" type="success" style="width: 61px;text-align: center;" />                

                        </view>

                        <view v-else>

                            <uni-tag text="禁用" type="error" style="width: 61px;text-align: center;" />      

                        </view>

   

                    </uni-td>

   

                </uni-tr>

            </uni-table>

        </view>

    </view>

</template>

<script>

    export default

    {

       

        data()

        {

            return {

                title: 'Hello',

                list: [],//1步:声明数据局部变量,用于存储从服务器端获取的数据。

               

                //下面两个为第3“uni-tag”组件的局部变量,用于与当前vue视图页面中的指定标签进行绑定,为当前vue视图页面渲染显示提供数据支撑。

                type: "default",

                inverted: false,

            }

        },

        onLoad()

        {

            //3步:如果vue视图页面绑定有从指定方法获取的数据,则在vue视图页面渲染显示前,通过指定方法获取数据,为vue视图页面渲染显示提供数据支撑。

            this.getFloorList();

        },

        methods:

        {

            //2步:通过调用相对路由(“/api/public/v1/home/swiperdata”),获取该服务端控制器方法中的数据,并打印。

            //注意:该相对路由(“/api/public/v1/home/swiperdata”)的绝对路由是:“https://api-hmugo-web.itheima.net/api/public/v1/home/swiperdata”

            //注意:该相对路由(“/role/get”)的绝对路由是:“http://localhost:8080/role/get”

            async getFloorList()

            {

                //根据绝对路由在浏览器中的JSON编码格式的数据,重构“const”变量。

                const {data:{status,response}} = await uni.$http.get('/role/get');

                console.log(status);

                if(status !== 200)

                    return uni.$showMsg();

                this.list= response.data;

                console.log(this.list);

            },

           

            //日期数据格式化输出渲染显示。

            dateFormat(time) {

                let date = new Date(time);

                let year = date.getFullYear();

                // 在日期格式中,月份是从0开始的,因此要加0,使用三元表达式在小于10的前面加0,以达到格式统一   09:11:05

                let month = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1;

                let day = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();

                let hours = date.getHours() < 10 ? "0" + date.getHours() : date.getHours();

                let minutes = date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes();

                let seconds = date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds();

                // 拼接

                return year + "-" + month + "-" + day + " " + hours + "" + minutes + "" + seconds;

            },

                       

            //下面两个为第3“uni-tag”组件的方法,用于对上面定义的两个局部变量:typeinverted进行赋值,通过相对应的赋值,

            //当前vue视图页面中的“uni-tag”组件在渲染显示时,显示为相对应的样式。

            setType() {

                let types = ["default", "primary", "success", "warning", "error"];

                let index = types.indexOf(this.type);

                types.splice(index, 1);

                let randomIndex = Math.floor(Math.random() * 4);

                this.type = types[randomIndex];

            },

            setInverted() {

                this.inverted = !this.inverted;

            },          

        }

    }

</script>

3.5 执行效果

      注意:

        到此为止“VSCodeVue3初识”系列已经结束,本人把word版的内容已经上传到了网上,有兴趣的讲到:“(3条消息) VSCodeVue3初识.docx-电子商务文档类资源-CSDN文库”下载

对以上功能更为具体实现和注释见:22-09-25-06_uniAppVue3(uin-app本地主机数据跨域(Cors)数据交互实现之--前端)。


http://chatgpt.dhexx.cn/article/YJ6nu4VT.shtml

相关文章

uin-app map标签出现黑边问题

uin-app map标签出现黑边问题 uin-app 的map标签在app端真机调试时出现了黑边&#xff0c;功能是map标签上有个半透明蒙版&#xff0c;点击蒙版调用 uni.chooseLocationAPI,获取经纬度和地址名称。 获取到了经纬度和地址名称后展示在多行文本框内&#xff0c;多行文本框没有定…

uin-app实现微信直播功能

1、在配置文件中插入微信小程序的插件代码&#xff0c;如下图&#xff1a; 2、页面代码如下&#xff0c;可以直接复制进去用&#xff1a; <template> <view class"content"> <button click"getLiveList">获取直播列表</button>…

uin-app 使用阿里云iconfont图标

uin-app 使用阿里云iconfont图标 介绍开始1. 去阿里云图标选择自己&#xff0c;需要的图标&#xff0c;然后加入购物车。2. 进入购物车&#xff0c;下载源码3. 下载好以后&#xff0c;解压&#xff0c;把压缩包里面的文件放在相应的位置4. 在main.js 里面引入css文件5. 在vue页…

服务器日志过滤uin

为什么80%的码农都做不了架构师&#xff1f;>>> 问题 在服务器打印的log中有很多用户的uin&#xff0c;这些uin是命中了CGI的频率限制打印出来的&#xff0c;现在需要统计uin出现的次数进而判断它是否为异常uin。打印次数越多的uin异常可能性也就越大。 日志如下 &…

uin-app(1)

uin-app 最近企业老师来给讲uin-app,对最近的学习成果做一总结 什么叫uin-app? uni-app 是一个使用 Vue.js 开发所有前端应用的框架&#xff0c;开发者编写一套代码&#xff0c;可发布到iOS、Android、H5、以及各种小程序&#xff08;微信/支付宝/百度/头条/QQ/钉钉&#x…

uin.app学习心得

关于uin.app 在当今的信息时代&#xff0c;学习已成为一个不可缺少的部分。由于互联网和智能设备的普及&#xff0c;学习的方式也已发生了很大的变化。于是一些新型的教育工具也应运而生&#xff0c;如今&#xff0c;uin.app便成为了新型时代下的学生和老师们的得力助手和强大…

微信中H5通过uin_base64链接跳转公众号关注页面,关注按钮闪一下消失?

之前遇到一个场景&#xff0c;需要H5中点击链接跳转到公众号关注页面&#xff0c;于是收集了很多资料&#xff0c;发现很多博主的解决方案都是使用公众号的数字ID的base64编码&#xff08;在微信公众平台登录公众号之后&#xff0c;右键查看源代码&#xff0c;ctrlf 搜索uin&am…

【C/C++】uin8_t uint16_t uint32_t uint64_t数据类型解析

作者&#xff1a;柒号华仔 个人主页&#xff1a;欢迎访问我的主页 个人信条&#xff1a;星光不问赶路人,岁月不负有心人。 个人方向&#xff1a;专注于5G领域&#xff0c;同时兼顾其他网络协议&#xff0c;编解码协议&#xff0c;C/C&#xff0c;linux等&#xff0c;感兴趣的小…

微信直接打开公众号页面 公众号uin_base64直接获取(不用管理员账号 直接获取)

在网上看了获取微信公众号链接直接跳转的方法 但是需要获取uin_base64这个参数 而且都是要管理员登录微信公众平台才行&#xff0c;但是很多情况下我们不是公众号的管理员 所以f12获取参数根本不可能 后来经他人提醒&#xff0c;看到了用这种类似的方法&#xff0c;不过比这个麻…

手机QQ空间装逼代码收集

使用方法&#xff1a;复制代码&#xff0c;可修改代码中汉字信息&#xff0c;发表说说之后&#xff0c;将会看到代码生成的效果。 &#xff08;注&#xff1a;在电脑观看QQ空间可以看到源码&#xff09; 效果图&#xff1a; 手表代码↓ [em]e10026[/em]{uin:5720,nick:Gold …

如何获取微信uin

首先解释什么是微信的“uin”&#xff1a;uin就是user information&#xff0c;也就是特定微信用户的ID。 为什么要取得uin呢&#xff1f;&#xff1a;因为有读取微信聊天记录的需求&#xff0c;微信android版的数据库文件是可以取到的&#xff0c;但是微信对数据库进行了加密…

空字符和空白字符

空格、制表符、换行符&#xff08;创建新行&#xff09;、回车符、换页符、垂直制表符称为“空白字符”&#xff0c;因为它们与打印页上的单词和行之间的空格一样都是起到方便阅读的作用。 标记由空白字符和其他标记分隔&#xff08;划分边界&#xff09;&#xff0c;如运算符和…

从String中移除空白字符的多种方式!?

字符串&#xff0c;是Java中最常用的一个数据类型了。我们在日常开发时候会经常使用字符串做很多的操作。比如字符串的拼接、截断、替换等。 这一篇文章&#xff0c;我们介绍一个比较常见又容易被忽略的一个操作&#xff0c;那就是移除字符串中的空格。 其实&#xff0c;在Ja…

字符串常用操作方法之修改之删除空白字符

字符串操作的实验训练 105_字符串常用操作方法之修改之删除空白字符 105_字符串常用操作方法之修改之删除空白字符 lstrip():删除字符串左侧空白字符。 mystr1 " 好好 学习 然后 才有 可能 天天 向上 " print(mystr1) #5.lstrip() 删除左侧空白字…

Python检测字符串是否只含“空白字符”

【小白从小学Python、C、Java】 【Python全国计算机等级考试】 【Python数据分析考试必会题】 ● 标题与摘要 Python检测字符串是否只含“空白字符” isspace()方法 ● 选择题 以下代码输出结果是&#xff1f; print(" ".isspace(),"a b".isspace()) A Tru…

1.7 正则表达式【匹配空白字符和非空白字符】

空白字符匹配符 \s \s 可以配置" "字符 非空白字符匹配符 \s \S 可以配置非" "字符的 测试实例 被匹配字符串 private static final String test1 "a1 2ad f31d-2 tt"; 匹配公式1 匹配公式 String expression1 "\\s"; 匹配结…

java 替换空白字符串

1、用法 字符串.trim(); // 去除前后空白符 字符串.replace(String oldChar, String newChar); 字符串.replaceAll(String regex, String replacement); 字符串.replaceFirst(String regex, String replacement);2、replace()、replaceAll()和replaceFirst()的区别 1、trim()…

c++ 去除字符串首尾的空白字符

c 去除字符串首尾的空白字符 方法一使用find_first_not_of和find_last_not_of方法二使用正则表达式(c11)测试测试结果 方法一使用find_first_not_of和find_last_not_of /*** brief Trimmed 去掉首尾 空格白* param str*/ void Trimmed(std::string& str) {str.erase(0, s…

如何快速检测是否为空白字符

作者&#xff1a;温绍锦(高铁) 阿里云计算平台团队 在Parser场景&#xff0c;包括SQL Parser和JSON Parser&#xff0c;如何更快检测空白字符是一个提升性能的关键点。笔者有多年SQL Parser和JSON Parser的经验&#xff0c;把我所知道的一些检测空白的方法分享给大家。 一、什…