日记 2022-5-4(vue技术图片64)

自身夯实:

登录功能:iview/element ui 表单校验,验证登录,flex布局 , vuex信息获取与存储,样式穿透

<Form action ref="formInline" :model="formInline" :rules="ruleInline">
	<FormItem prop="ID">
		<Input type="text" v-model="formInline.ID" placeholder="账号">
		<img src="../../assets/images/user.png" style="width: 40px; height: 40px;" alt=""
			slot="prepend">
		</Input>
	</FormItem>
	<FormItem prop="PW">
		<Input type="password" v-model="formInline.PW" @keyup.native.enter="toLogin('formInline')"
			placeholder="密码">
		<img src="../../assets/images/password.png" style="width: 40px; height: 40px;" alt=""
			slot="prepend">
		</Input>
	</FormItem>
	<FormItem prop="code" class="form-item-code">
		<Input type="text" v-model="formInline.code" @keyup.native.enter="toLogin('formInline')"
			placeholder="验证码" class="code-input">
		<img src="../../assets/images/login-code.png" style="width: 40px; height: 40px;" alt=""
			slot="prepend">
		</Input>
		<div id="v_container" class="flex-row-center-center" @click="changeCode">
			<img :src="'data:image/png;base64,' + codeImg" v-show="codeImg" alt="">
		</div>

	</FormItem>
	<FormItem class="checked-pw">
		<Checkbox size="large" v-model="checked">记住密码</Checkbox>
	</FormItem>
	<FormItem>
		<Button type="primary" @click="toLogin('formInline')">登录</Button>
	</FormItem>
</Form>
toLogin(formInline) {
			let _this = this;
			this.$refs[formInline].validate(valid => {
				if (valid) {
					this.loading = true;
					_this.axios({
						method: "POST",
						url: apiLogin,
						data: {
							username: this.formInline.ID.trim(),
							password: this.formInline.PW.trim(),
							code: this.formInline.code,
							uuid: this.formInline.uuid,
						}
					}).then(res => {
						_this.loading = false;
						if (res.status == 200) {
							/* 判断是否为该县级用户 */
							if (res.data.User._ORG_.LVL == 1 && res.data.User._ORG_._AREA_.NAME != mapInfo.prv) {
								return _this.$Message.success("账号不存在!");
							} else if (res.data.User._ORG_.LVL == 2 && res.data.User._ORG_._AREA_.NAME != mapInfo.city) {
								return _this.$Message.success("账号不存在!");
							} else if (res.data.User._ORG_.LVL == 3 && res.data.User._ORG_._AREA_.NAME != mapInfo.cnty) {
								return _this.$Message.success("账号不存在!");
							} else if (res.data.User._ORG_.LVL == 4 && res.data.User._ORG_._AREA_.FULLNAME.split('`')[2] != mapInfo.cnty) {
								return _this.$Message.success("账号不存在!");
							}
							_this.$store.commit("set_token", res.data.Token);
							_this.$store.commit("set_userInfo", res.data.User);
							_this.$store.dispatch("getRSCS", {
								Token: res.data.Token,
							});//获取水库规模筛选数据

							localStorage.setItem('systemName_' + mapInfo.cnty, res.data.User._ORG_.SYS_NAME || mapInfo.SYSTEM_NAME);
							_this.$store.commit('set_system_name', res.data.User._ORG_.SYS_NAME || mapInfo.SYSTEM_NAME);
							_this.$store.dispatch("getArea");//获取水库地区筛选数据
							_this.savePW();//记住密码
							_this.goHome();
							_this.$Message.success("登录成功!");
						} else {
							_this.$Message.error(res.data.m);
						}
					})
						.catch(error => {
							_this.loading = false;
							error ? _this.$Message.error(error.data.m) : _this.$Message.error('请求失败');
						});
				} else {
					_this.$Message.error("登录失败!");
				}
			});
		},
//校验提示文字
>>>.ivu-form-item-error-tip {
	color: #fff;
	font-size: 14px;
}

自身遗忘:

页面获取路由信息

this.$router.options.routes.filter(item => !item.hidden)

css flex:1
大概意思:在当前区域该元素占比为1
MDN

get新知识:

图片转换64:什么是图片转换64

自结:将一张图片数据编码成一串字符串,使用该字符串代替图像地址url

<img :src="'data:image/png;base64,' + codeImg" v-show="codeImg" alt="">
/* 
// 验证码
 */
changeCode() {
	this.axios({
		method: "GET",
		url: captchaImage,
	}).then(res => {
		if (res.data.code == 200) {
			this.formInline.uuid = res.data.uuid;
			this.codeImg = res.data.img;//这里就是图片编码字符串
		} else {
			_this.$Message.error("请求失败,请稍后重试!");
		}
	})
		.catch(error => {
			this.$Message.error("请求失败,请稍后重试!");
			console.log(error);
		});
},
img: "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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="

input slot 插槽

<Input type="password" v-model="formInline.PW" @keyup.native.enter="toLogin('formInline')"
placeholder="密码">
<img src="../../assets/images/password.png" style="width: 40px; height: 40px;" alt=""
slot="prepend">
</Input>

slot=“prepend” 放置图片代替以前放置图标
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用 `vue-photo-sphere-viewer` 库来集成 `photo-sphere-viewer` 到 Vue.js 4 中,然后在组件中使用这个库的 API 来实现图片切换。具体步骤如下: 1. 安装 `vue-photo-sphere-viewer` 库: ```bash npm install vue-photo-sphere-viewer --save ``` 2. 在组件中引入 `vue-photo-sphere-viewer` 库: ```javascript import PhotoSphereViewer from 'vue-photo-sphere-viewer'; import 'photo-sphere-viewer/dist/photo-sphere-viewer.css'; ``` 3. 在模板中使用 `PhotoSphereViewer` 组件,并绑定图片路径和其他属性: ```html <template> <div> <photo-sphere-viewer :panorama-url="panoramaUrl" :default-longitude="defaultLongitude" :default-latitude="defaultLatitude" :default-zoom="defaultZoom" :size="size" :min-zoom="minZoom" :max-zoom="maxZoom" @ready="onReady" ></photo-sphere-viewer> </div> </template> ``` 其中,`panoramaUrl` 是图片路径,`defaultLongitude`、`defaultLatitude` 和 `defaultZoom` 是初始位置和缩放级别,`size` 是全景图像素大小,`minZoom` 和 `maxZoom` 是缩放级别的最小值和最大值。 4. 在组件的 `methods` 中定义 `onReady` 方法来获取 `PhotoSphereViewer` 实例,并调用 `setPanorama` 方法来切换图片: ```javascript methods: { onReady(viewer) { this.viewer = viewer; }, switchImage(imagePath) { this.viewer.setPanorama(imagePath); }, } ``` 然后你可以在组件的其他方法中调用 `switchImage` 方法来切换图片。 ```javascript this.switchImage('/path/to/another/image.jpg'); ``` 注意,这里的 `vue-photo-sphere-viewer` 库只是 `photo-sphere-viewer` 的 Vue.js 封装,你还需要在项目中引入 `photo-sphere-viewer` 库本身。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值