commit
6d394eb94e
|
@ -29,7 +29,7 @@
|
||||||
"jsencrypt": "^3.3.2",
|
"jsencrypt": "^3.3.2",
|
||||||
"pinia": "^2.1.7",
|
"pinia": "^2.1.7",
|
||||||
"pinia-plugin-persistedstate": "^3.2.1",
|
"pinia-plugin-persistedstate": "^3.2.1",
|
||||||
"vue-cropper": "^1.1.3",
|
"vue-cropper": "^1.0.3",
|
||||||
"vue-router": "^4.4.0"
|
"vue-router": "^4.4.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
http-equiv="Content-Security-Policy"
|
http-equiv="Content-Security-Policy"
|
||||||
content="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:"
|
content="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:"
|
||||||
/> -->
|
/> -->
|
||||||
<meta http-equiv="Content-Security-Policy" content="connect-src *; default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:" />
|
<meta http-equiv="Content-Security-Policy" content="connect-src *; default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob:" />
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
|
|
|
@ -31,10 +31,10 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref, reactive } from 'vue'
|
import { ref, reactive, getCurrentInstance } from 'vue'
|
||||||
import { updateUserPwd } from '@/api/system/user'
|
import { updateUserPwd } from '@/api/system/user'
|
||||||
|
|
||||||
// const { proxy } = getCurrentInstance();
|
const { proxy } = getCurrentInstance()
|
||||||
|
|
||||||
const user = reactive({
|
const user = reactive({
|
||||||
oldPassword: undefined,
|
oldPassword: undefined,
|
||||||
|
|
|
@ -1,175 +1,182 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="user-info-head" @click="editCropper()">
|
<div class="user-info-head" @click="editCropper()">
|
||||||
<img :src="options.img" title="点击上传头像" class="img-circle" />
|
<img :src="options.img" title="点击上传头像" class="img-circle img-lg" />
|
||||||
<el-dialog :title="title" v-model="open" width="800px" append-to-body @opened="modalOpened" @close="closeDialog">
|
<el-dialog
|
||||||
<el-row>
|
:title="title"
|
||||||
<el-col :xs="24" :md="12" :style="{ height: '350px' }">
|
v-model="open"
|
||||||
<vue-cropper
|
width="800px"
|
||||||
ref="cropper"
|
append-to-body
|
||||||
:img="options.img"
|
@opened="modalOpened"
|
||||||
:info="true"
|
@close="closeDialog"
|
||||||
:autoCrop="options.autoCrop"
|
>
|
||||||
:autoCropWidth="options.autoCropWidth"
|
<el-row>
|
||||||
:autoCropHeight="options.autoCropHeight"
|
<el-col :xs="24" :md="12" :style="{ height: '350px' }">
|
||||||
:fixedBox="options.fixedBox"
|
<vue-cropper
|
||||||
:outputType="options.outputType"
|
ref="cropper"
|
||||||
@realTime="realTime"
|
:img="options.img"
|
||||||
v-if="visible"
|
:info="true"
|
||||||
/>
|
:autoCrop="options.autoCrop"
|
||||||
</el-col>
|
:autoCropWidth="options.autoCropWidth"
|
||||||
<el-col :xs="24" :md="12" :style="{ height: '350px' }">
|
:autoCropHeight="options.autoCropHeight"
|
||||||
<div class="avatar-upload-preview">
|
:fixedBox="options.fixedBox"
|
||||||
<img :src="options.previews.url" :style="options.previews.img" />
|
:outputType="options.outputType"
|
||||||
</div>
|
@realTime="realTime"
|
||||||
</el-col>
|
v-if="visible"
|
||||||
</el-row>
|
/>
|
||||||
<br />
|
</el-col>
|
||||||
<el-row>
|
<el-col :xs="24" :md="12" :style="{ height: '350px' }">
|
||||||
<el-col :lg="2" :md="2">
|
<div class="avatar-upload-preview">
|
||||||
<el-upload
|
<img :src="options.previews.url" :style="options.previews.img" />
|
||||||
action="#"
|
</div>
|
||||||
:http-request="requestUpload"
|
</el-col>
|
||||||
:show-file-list="false"
|
</el-row>
|
||||||
:before-upload="beforeUpload"
|
<br />
|
||||||
>
|
<el-row>
|
||||||
<el-button>
|
<el-col :lg="2" :md="2">
|
||||||
选择
|
<el-upload
|
||||||
<el-icon class="el-icon--right"><Upload /></el-icon>
|
action="#"
|
||||||
</el-button>
|
:http-request="requestUpload"
|
||||||
</el-upload>
|
:show-file-list="false"
|
||||||
</el-col>
|
:before-upload="beforeUpload"
|
||||||
<el-col :lg="{ span: 1, offset: 2 }" :md="2">
|
>
|
||||||
<el-button :icon="Plus" @click="changeScale(1)"></el-button>
|
<el-button>
|
||||||
</el-col>
|
选择
|
||||||
<el-col :lg="{ span: 1, offset: 1 }" :md="2">
|
<el-icon class="el-icon--right"><Upload /></el-icon>
|
||||||
<el-button :icon="Minus" @click="changeScale(-1)"></el-button>
|
</el-button>
|
||||||
</el-col>
|
</el-upload>
|
||||||
<el-col :lg="{ span: 1, offset: 1 }" :md="2">
|
</el-col>
|
||||||
<el-button :icon="RefreshLeft" @click="rotateLeft()"></el-button>
|
<el-col :lg="{ span: 1, offset: 2 }" :md="2">
|
||||||
</el-col>
|
<el-button :icon="Plus" @click="changeScale(1)"></el-button>
|
||||||
<el-col :lg="{ span: 1, offset: 1 }" :md="2">
|
</el-col>
|
||||||
<el-button :icon="RefreshRight" @click="rotateRight()"></el-button>
|
<el-col :lg="{ span: 1, offset: 1 }" :md="2">
|
||||||
</el-col>
|
<el-button :icon="Minus" @click="changeScale(-1)"></el-button>
|
||||||
<el-col :lg="{ span: 2, offset: 6 }" :md="2">
|
</el-col>
|
||||||
<el-button type="primary" @click="uploadImg()">提 交</el-button>
|
<el-col :lg="{ span: 1, offset: 1 }" :md="2">
|
||||||
</el-col>
|
<el-button :icon="RefreshLeft" @click="rotateLeft()"></el-button>
|
||||||
</el-row>
|
</el-col>
|
||||||
</el-dialog>
|
<el-col :lg="{ span: 1, offset: 1 }" :md="2">
|
||||||
</div>
|
<el-button :icon="RefreshRight" @click="rotateRight()"></el-button>
|
||||||
</template>
|
</el-col>
|
||||||
|
<el-col :lg="{ span: 2, offset: 6 }" :md="2">
|
||||||
|
<el-button type="primary" @click="uploadImg()">提 交</el-button>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</el-dialog>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { Upload, Plus, Minus, RefreshLeft, RefreshRight } from '@element-plus/icons-vue'
|
import { Upload, Plus, Minus, RefreshLeft, RefreshRight } from '@element-plus/icons-vue'
|
||||||
import { ref, reactive } from 'vue'
|
import { ref, reactive, getCurrentInstance } from 'vue'
|
||||||
import "vue-cropper/dist/index.css";
|
import 'vue-cropper/dist/index.css'
|
||||||
import { VueCropper } from "vue-cropper";
|
import { VueCropper } from 'vue-cropper'
|
||||||
import { uploadAvatar } from "@/api/system/user";
|
import { uploadAvatar } from '@/api/system/user'
|
||||||
import useUserStore from "@/store/modules/user";
|
import useUserStore from '@/store/modules/user'
|
||||||
|
|
||||||
const userStore = useUserStore();
|
const userStore = useUserStore()
|
||||||
// const { proxy } = getCurrentInstance();
|
const { proxy } = getCurrentInstance()
|
||||||
|
|
||||||
const open = ref(false);
|
const open = ref(false)
|
||||||
const visible = ref(false);
|
const visible = ref(false)
|
||||||
const title = ref("修改头像");
|
const title = ref('修改头像')
|
||||||
|
|
||||||
//图片裁剪数据
|
//图片裁剪数据
|
||||||
const options = reactive({
|
const options = reactive({
|
||||||
img: userStore.avatar, // 裁剪图片的地址
|
img: userStore.avatar, // 裁剪图片的地址
|
||||||
autoCrop: true, // 是否默认生成截图框
|
autoCrop: true, // 是否默认生成截图框
|
||||||
autoCropWidth: 200, // 默认生成截图框宽度
|
autoCropWidth: 200, // 默认生成截图框宽度
|
||||||
autoCropHeight: 200, // 默认生成截图框高度
|
autoCropHeight: 200, // 默认生成截图框高度
|
||||||
fixedBox: true, // 固定截图框大小 不允许改变
|
fixedBox: true, // 固定截图框大小 不允许改变
|
||||||
outputType: "png", // 默认生成截图为PNG格式
|
outputType: 'png', // 默认生成截图为PNG格式
|
||||||
previews: {} //预览数据
|
previews: {} //预览数据
|
||||||
});
|
})
|
||||||
|
|
||||||
/** 编辑头像 */
|
/** 编辑头像 */
|
||||||
function editCropper() {
|
function editCropper() {
|
||||||
open.value = true;
|
open.value = true
|
||||||
}
|
}
|
||||||
/** 打开弹出层结束时的回调 */
|
/** 打开弹出层结束时的回调 */
|
||||||
function modalOpened() {
|
function modalOpened() {
|
||||||
visible.value = true;
|
visible.value = true
|
||||||
}
|
}
|
||||||
/** 覆盖默认上传行为 */
|
/** 覆盖默认上传行为 */
|
||||||
function requestUpload() {}
|
function requestUpload() {}
|
||||||
/** 向左旋转 */
|
/** 向左旋转 */
|
||||||
function rotateLeft() {
|
function rotateLeft() {
|
||||||
proxy.$refs.cropper.rotateLeft();
|
proxy.$refs.cropper.rotateLeft()
|
||||||
}
|
}
|
||||||
/** 向右旋转 */
|
/** 向右旋转 */
|
||||||
function rotateRight() {
|
function rotateRight() {
|
||||||
proxy.$refs.cropper.rotateRight();
|
proxy.$refs.cropper.rotateRight()
|
||||||
}
|
}
|
||||||
/** 图片缩放 */
|
/** 图片缩放 */
|
||||||
function changeScale(num) {
|
function changeScale(num) {
|
||||||
num = num || 1;
|
num = num || 1
|
||||||
proxy.$refs.cropper.changeScale(num);
|
proxy.$refs.cropper.changeScale(num)
|
||||||
}
|
}
|
||||||
/** 上传预处理 */
|
/** 上传预处理 */
|
||||||
function beforeUpload(file) {
|
function beforeUpload(file) {
|
||||||
if (file.type.indexOf("image/") == -1) {
|
if (file.type.indexOf('image/') == -1) {
|
||||||
proxy.$modal.msgError("文件格式错误,请上传图片类型,如:JPG,PNG后缀的文件。");
|
proxy.$modal.msgError('文件格式错误,请上传图片类型,如:JPG,PNG后缀的文件。')
|
||||||
} else {
|
} else {
|
||||||
const reader = new FileReader();
|
const reader = new FileReader()
|
||||||
reader.readAsDataURL(file);
|
reader.readAsDataURL(file)
|
||||||
reader.onload = () => {
|
reader.onload = () => {
|
||||||
options.img = reader.result;
|
options.img = reader.result
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/** 上传图片 */
|
}
|
||||||
function uploadImg() {
|
/** 上传图片 */
|
||||||
proxy.$refs.cropper.getCropBlob(data => {
|
function uploadImg() {
|
||||||
let formData = new FormData();
|
proxy.$refs.cropper.getCropBlob((data) => {
|
||||||
formData.append("avatarfile", data);
|
let formData = new FormData()
|
||||||
uploadAvatar(formData).then(response => {
|
formData.append('avatarfile', data)
|
||||||
open.value = false;
|
uploadAvatar(formData).then((response) => {
|
||||||
options.img = import.meta.env.VITE_APP_BASE_API + response.imgUrl;
|
open.value = false
|
||||||
userStore.avatar = options.img;
|
options.img = import.meta.env.VITE_APP_BASE_API + response.imgUrl
|
||||||
proxy.$modal.msgSuccess("修改成功");
|
userStore.avatar = options.img
|
||||||
visible.value = false;
|
proxy.$modal.msgSuccess('修改成功')
|
||||||
});
|
visible.value = false
|
||||||
});
|
})
|
||||||
}
|
})
|
||||||
/** 实时预览 */
|
}
|
||||||
function realTime(data) {
|
/** 实时预览 */
|
||||||
options.previews = data;
|
function realTime(data) {
|
||||||
}
|
options.previews = data
|
||||||
/** 关闭窗口 */
|
}
|
||||||
function closeDialog() {
|
/** 关闭窗口 */
|
||||||
options.img = userStore.avatar;
|
function closeDialog() {
|
||||||
options.visible = false;
|
options.img = userStore.avatar
|
||||||
}
|
options.visible = false
|
||||||
</script>
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
<style lang='scss' scoped>
|
<style lang='scss' scoped>
|
||||||
.user-info-head {
|
.user-info-head {
|
||||||
position: relative;
|
position: relative;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
height: 120px;
|
height: 120px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.user-info-head:hover:after {
|
.user-info-head:hover:after {
|
||||||
content: "+";
|
content: '+';
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: 0;
|
left: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
top: 0;
|
top: 0;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
color: #eee;
|
color: #eee;
|
||||||
background: rgba(0, 0, 0, 0.5);
|
background: rgba(0, 0, 0, 0.5);
|
||||||
font-size: 24px;
|
font-size: 24px;
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
-webkit-font-smoothing: antialiased;
|
-webkit-font-smoothing: antialiased;
|
||||||
-moz-osx-font-smoothing: grayscale;
|
-moz-osx-font-smoothing: grayscale;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
line-height: 110px;
|
line-height: 110px;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
}
|
}
|
||||||
.img-circle {
|
.img-circle {
|
||||||
height: 120px;
|
height: 120px;
|
||||||
width: auto
|
width: auto;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
|
@ -1,89 +1,104 @@
|
||||||
<template>
|
<template>
|
||||||
<el-form ref="userRef" :model="user" :rules="rules" label-width="80px">
|
<el-form ref="userRef" :model="user" :rules="rules" label-width="80px">
|
||||||
<el-form-item label="用户昵称" prop="nickName">
|
<el-form-item label="用户昵称" prop="nickName">
|
||||||
<el-input v-model="user.nickName" maxlength="30" />
|
<el-input v-model="user.nickName" maxlength="30" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="手机号码" prop="phonenumber">
|
<el-form-item label="手机号码" prop="phonenumber">
|
||||||
<el-input v-model="user.phonenumber" maxlength="11" />
|
<el-input v-model="user.phonenumber" maxlength="11" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="邮箱" prop="email">
|
<el-form-item label="邮箱" prop="email">
|
||||||
<el-input v-model="user.email" maxlength="50" />
|
<el-input v-model="user.email" maxlength="50" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="性别">
|
<el-form-item label="性别">
|
||||||
<el-radio-group >
|
<el-radio-group v-model="user.sex">
|
||||||
<el-radio label="0">男</el-radio>
|
<el-radio label="0">男</el-radio>
|
||||||
<el-radio label="1">女</el-radio>
|
<el-radio label="1">女</el-radio>
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="任教学科">
|
<el-form-item label="任教学科">
|
||||||
<el-radio-group v-model="user.edusubject">
|
<el-radio-group v-model="user.edusubject">
|
||||||
<template v-for="item in subjectList">
|
<template v-for="item in subjectList">
|
||||||
<el-radio v-if="item.edustage==user.edustage" :label="item.itemtitle">{{ item.itemtitle }}</el-radio>
|
<el-radio v-if="item.edustage == user.edustage" :label="item.itemtitle">{{
|
||||||
</template>
|
item.itemtitle
|
||||||
</el-radio-group>
|
}}</el-radio>
|
||||||
</el-form-item>
|
</template>
|
||||||
<el-form-item>
|
</el-radio-group>
|
||||||
<el-button type="primary" @click="submit">保存</el-button>
|
</el-form-item>
|
||||||
<el-button type="primary" @click="handleclick1">测验</el-button>
|
<el-form-item>
|
||||||
</el-form-item>
|
<el-button type="primary" @click="submit">保存</el-button>
|
||||||
</el-form>
|
</el-form-item>
|
||||||
</template>
|
</el-form>
|
||||||
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref } from 'vue'
|
import { ref, getCurrentInstance } from 'vue'
|
||||||
import { updateUserProfile } from "@/api/system/user";
|
import { updateUserProfile } from '@/api/system/user'
|
||||||
import { listEvaluation } from "@/api/subject/index";
|
import { listEvaluation } from '@/api/subject/index'
|
||||||
|
|
||||||
const props = defineProps({
|
|
||||||
user: {
|
|
||||||
type: Object
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// const { proxy } = getCurrentInstance();
|
|
||||||
|
|
||||||
const rules = ref({
|
|
||||||
nickName: [{ required: true, message: "用户昵称不能为空", trigger: "blur" }],
|
|
||||||
email: [{ required: true, message: "邮箱地址不能为空", trigger: "blur" }, { type: "email", message: "请输入正确的邮箱地址", trigger: ["blur", "change"] }],
|
|
||||||
phonenumber: [{ required: true, message: "手机号码不能为空", trigger: "blur" }, { pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "请输入正确的手机号码", trigger: "blur" }],
|
|
||||||
});
|
|
||||||
|
|
||||||
const subjectList = ref([]);
|
|
||||||
|
|
||||||
function handleclick1() {
|
const props = defineProps({
|
||||||
console.log(props.user.edudegree)
|
user: {
|
||||||
}
|
type: Object
|
||||||
|
}
|
||||||
// 获取基础的学科
|
})
|
||||||
listEvaluation({ itemkey: "subject", pageSize: 500 }).then((res) => {
|
|
||||||
subjectList.value = res.rows;
|
const { proxy } = getCurrentInstance()
|
||||||
});
|
|
||||||
|
const rules = ref({
|
||||||
setTimeout(() => {
|
nickName: [{ required: true, message: '用户昵称不能为空', trigger: 'blur' }],
|
||||||
|
email: [
|
||||||
if (props.user.edudegree != '') {
|
{ required: true, message: '邮箱地址不能为空', trigger: 'blur' },
|
||||||
var upcaseName = ['一年级', '二年级', '三年级', '四年级', '五年级', '六年级', '初一', '初二', '初三', '高一', '高二', '高三'];
|
{ type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] }
|
||||||
var d = parseInt(props.user.edudegree.replace('年级', ''));
|
],
|
||||||
if (d <= 6) {
|
phonenumber: [
|
||||||
props.user.edustage = '小学';
|
{ required: true, message: '手机号码不能为空', trigger: 'blur' },
|
||||||
} else if (d >= 7 && d <= 9) {
|
{ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: '请输入正确的手机号码', trigger: 'blur' }
|
||||||
props.user.edustage = '初中';
|
]
|
||||||
} else if (d >= 9 && d <= 12) {
|
})
|
||||||
props.user.edustage = '高中';
|
|
||||||
}
|
const subjectList = ref([])
|
||||||
props.user.stagelabel = upcaseName[d-1];
|
|
||||||
}
|
// 获取基础的学科
|
||||||
}, 1000);
|
listEvaluation({ itemkey: 'subject', pageSize: 500 }).then((res) => {
|
||||||
|
subjectList.value = res.rows
|
||||||
/** 提交按钮 */
|
})
|
||||||
function submit() {
|
|
||||||
proxy.$refs.userRef.validate(valid => {
|
setTimeout(() => {
|
||||||
if (valid) {
|
if (props.user.edudegree != '') {
|
||||||
console.log(props.user);
|
var upcaseName = [
|
||||||
updateUserProfile(props.user).then(response => {
|
'一年级',
|
||||||
proxy.$modal.msgSuccess("修改成功");
|
'二年级',
|
||||||
});
|
'三年级',
|
||||||
}
|
'四年级',
|
||||||
});
|
'五年级',
|
||||||
};
|
'六年级',
|
||||||
</script>
|
'初一',
|
||||||
|
'初二',
|
||||||
|
'初三',
|
||||||
|
'高一',
|
||||||
|
'高二',
|
||||||
|
'高三'
|
||||||
|
]
|
||||||
|
var d = parseInt(props.user.edudegree.replace('年级', ''))
|
||||||
|
if (d <= 6) {
|
||||||
|
props.user.edustage = '小学'
|
||||||
|
} else if (d >= 7 && d <= 9) {
|
||||||
|
props.user.edustage = '初中'
|
||||||
|
} else if (d >= 9 && d <= 12) {
|
||||||
|
props.user.edustage = '高中'
|
||||||
|
}
|
||||||
|
props.user.stagelabel = upcaseName[d - 1]
|
||||||
|
}
|
||||||
|
}, 1000)
|
||||||
|
|
||||||
|
/** 提交按钮 */
|
||||||
|
function submit() {
|
||||||
|
proxy.$refs.userRef.validate((valid) => {
|
||||||
|
if (valid) {
|
||||||
|
console.log(props.user)
|
||||||
|
updateUserProfile(props.user).then((response) => {
|
||||||
|
proxy.$modal.msgSuccess('修改成功')
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
</script>
|
Loading…
Reference in New Issue