我的收藏模块

This commit is contained in:
熊丽君
2021-08-06 16:06:02 +08:00
parent 9084ba3a16
commit c2939eeb11
18 changed files with 1179 additions and 156 deletions

46
src/api/home/info.js Normal file
View File

@ -0,0 +1,46 @@
import request from '@/utils/request';
// 根据status查询字典集合 1->技术领域 2->需求类型 3->成熟度 4->合作标签 5->地级市 6->合肥区县 7->城市级别
export function getDictListByStatus(params) {
return request({
url: '/dict/getDictListByStatus',
params
});
}
// 获取设置企业画像初始化数据
export function getLabelSetting(params) {
return request({
url: '/mobile/getLabelSetting',
params
});
}
// 修改企业
export function updateCompanyUser(data) {
return request({
url: '/mobile/updateCompanyUser',
method: 'post',
data
});
}
// 个人中心:基本信息
export function userInfo(params) {
return request({
url: '/mobile/userInfo',
params
});
}
// 修改手机号/修改密码
export function updateInfo(data) {
return request({
url: '/mobile/updateInfo',
method: 'post',
data
});
}
// 分页查询个人收藏
export function getPolicy(params) {
return request({
url: '/mobile/getPolicy',
params
});
}

View File

@ -22,10 +22,10 @@ export function cancel(params) {
params
});
}
// 编辑政策的数据回显
// 政策的详细信息
export function getPolicyInfo(params) {
return request({
url: '/policy/getPolicyInfo',
url: '/mobile/getPolicyInfo',
params
});
}

10
src/api/user.js Normal file
View File

@ -0,0 +1,10 @@
import request from '@/utils/request';
// 用户头像上传
export function uploadAvatar(data) {
return request({
url: '/mobile/updateIcon',
method: 'post',
data: data
});
}

BIN
src/assets/image/icon10.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
src/assets/image/icon11.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
src/assets/image/icon9.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -1,91 +1,108 @@
<template> 
<template>
<div>
<el-upload
:action="useOss?ossUploadUrl:minioUploadUrl"
:data="useOss?dataObj:null"
:action="useOss ? ossUploadUrl : minioUploadUrl"
:data="useOss ? dataObj : null"
list-type="picture"
:multiple="false" :show-file-list="showFileList"
:multiple="false"
:show-file-list="showFileList"
:file-list="fileList"
:before-upload="beforeUpload"
:on-remove="handleRemove"
:on-success="handleUploadSuccess"
:on-preview="handlePreview">
<el-button size="small" type="primary">点击上传</el-button>
<div slot="tip" class="el-upload__tip">只能上传jpg/png文件且不超过10MB</div>
:on-preview="handlePreview"
>
<el-button size="small" type="primary">{{ text }}</el-button>
<div slot="tip" class="el-upload__tip" v-if="flag">
只能上传jpg/png文件且不超过10MB
</div>
</el-upload>
<el-dialog :visible.sync="dialogVisible">
<img width="100%" :src="fileList[0].url" alt="">
<img width="100%" :src="fileList[0].url" alt="" />
</el-dialog>
</div>
</template>
<script>
import {policy} from '@/api/oss'
import { policy } from '@/api/oss';
export default {
name: 'singleUpload',
props: {
value: String
export default {
name: 'singleUpload',
props: {
value: String,
text: {
type: String,
default: '点击上传'
},
computed: {
imageUrl() {
return this.value;
},
imageName() {
if (this.value != null && this.value !== '') {
return this.value.substr(this.value.lastIndexOf("/") + 1);
} else {
return null;
}
},
fileList() {
return [{
name: this.imageName,
url: this.imageUrl
}]
},
showFileList: {
get: function () {
return this.value !== null && this.value !== ''&& this.value!==undefined;
},
set: function (newValue) {
}
flag: {
type: Boolean,
default: false
}
},
computed: {
imageUrl() {
return this.value;
},
imageName() {
if (this.value != null && this.value !== '') {
return this.value.substr(this.value.lastIndexOf('/') + 1);
} else {
return null;
}
},
data() {
return {
dataObj: {
policy: '',
signature: '',
key: '',
ossaccessKeyId: '',
dir: '',
host: '',
// callback:'',
},
dialogVisible: false,
useOss:false, //使用oss->true;使用MinIO->false
ossUploadUrl:'http://macro-oss.oss-cn-shenzhen.aliyuncs.com',
minioUploadUrl:'http://192.168.99.239:1818/minio/upload',
};
},
methods: {
emitInput(val) {
this.$emit('input', val)
},
handleRemove(file, fileList) {
this.emitInput('');
},
handlePreview(file) {
this.dialogVisible = true;
},
beforeUpload(file) {
let _self = this;
if(!this.useOss){
//不使用oss不需要获取策略
return true;
fileList() {
return [
{
name: this.imageName,
url: this.imageUrl
}
return new Promise((resolve, reject) => {
policy().then(response => {
];
},
showFileList: {
get: function() {
return (
this.value !== null && this.value !== '' && this.value !== undefined
);
},
set: function(newValue) {}
}
},
data() {
return {
dataObj: {
policy: '',
signature: '',
key: '',
ossaccessKeyId: '',
dir: '',
host: ''
// callback:'',
},
dialogVisible: false,
useOss: false, //使用oss->true;使用MinIO->false
ossUploadUrl: 'http://macro-oss.oss-cn-shenzhen.aliyuncs.com',
// minioUploadUrl: 'http://192.168.99.239:1818/minio/upload'
minioUploadUrl: process.env.VUE_APP_BASE_API + '/minio/upload'
};
},
methods: {
emitInput(val) {
this.$emit('input', val);
},
handleRemove(file, fileList) {
this.emitInput('');
},
handlePreview(file) {
this.dialogVisible = true;
},
beforeUpload(file) {
let _self = this;
if (!this.useOss) {
//不使用oss不需要获取策略
return true;
}
return new Promise((resolve, reject) => {
policy()
.then(response => {
_self.dataObj.policy = response.data.policy;
_self.dataObj.signature = response.data.signature;
_self.dataObj.ossaccessKeyId = response.data.accessKeyId;
@ -93,29 +110,26 @@
_self.dataObj.dir = response.data.dir;
_self.dataObj.host = response.data.host;
// _self.dataObj.callback = response.data.callback;
resolve(true)
}).catch(err => {
console.log(err)
reject(false)
resolve(true);
})
})
},
handleUploadSuccess(res, file) {
this.showFileList = true;
this.fileList.pop();
let url = this.dataObj.host + '/' + this.dataObj.dir + '/' + file.name;
if(!this.useOss){
//不使用oss直接获取图片路径
url = res.data.url;
}
this.fileList.push({name: file.name, url: url});
this.emitInput(this.fileList[0].url);
.catch(err => {
console.log(err);
reject(false);
});
});
},
handleUploadSuccess(res, file) {
this.showFileList = true;
this.fileList.pop();
let url = this.dataObj.host + '/' + this.dataObj.dir + '/' + file.name;
if (!this.useOss) {
//不使用oss直接获取图片路径
url = res.data.url;
}
this.fileList.push({ name: file.name, url: url });
this.emitInput(this.fileList[0].url);
}
}
};
</script>
<style>
</style>
<style></style>

View File

@ -70,6 +70,39 @@ export const constantRoutes = [
component: resolve => require(['@/views/home/assessment'], resolve),
name: 'assessment',
meta: { title: '智能评估' }
},
{
path: 'mine',
redirect: '/mine/info',
component: resolve => require(['@/views/home/mine'], resolve),
name: 'mine',
meta: { title: '我的' },
children: [
{
path: '/mine/info',
component: resolve => require(['@/views/home/info'], resolve),
name: 'info',
meta: { title: '基本信息' }
},
{
path: '/mine/account',
component: resolve => require(['@/views/home/account'], resolve),
name: 'account',
meta: { title: '账户安全' }
},
{
path: '/mine/ollection',
component: resolve => require(['@/views/home/ollection'], resolve),
name: 'ollection',
meta: { title: '我的收藏' }
},
{
path: '/mine/news',
component: resolve => require(['@/views/home/news'], resolve),
name: 'news',
meta: { title: '消息通知' }
}
]
}
]
},

View File

@ -80,7 +80,7 @@ const user = {
} else {
commit('SET_ROLES', ['ROLE_DEFAULT']);
}
commit('SET_NAME', user.userName);
commit('SET_NAME', user.username);
commit('SET_AVATAR', avatar);
resolve(res);
})

View File

@ -0,0 +1,120 @@
<template>
<!-- 预览弹出层 -->
<el-dialog
title=""
:visible.sync="dialogVisible"
width="70%"
:before-close="close"
>
<h2>{{ formData.title }}</h2>
<div class="info" v-if="type != 'information'">
<span v-if="type != 'companyNeed' && type != 'scienceResult'"
>来源{{ formData.source }}</span
>
<span v-if="type == 'companyNeed'">价格{{ formData.price }}</span>
<el-image
v-if="type == 'scienceResult'"
style="width: 100px; height: 100px"
:src="formData.picList ? formData.picList[0] : ''"
fit="cover"
:preview-src-list="formData.picList"
></el-image>
<span
>发布{{
formData.listDate || parseTime(formData.createTime, '{y}-{m}-{d}')
}}</span
>
<span v-if="token && type == 'policy'">
<el-button
type="primary"
size="mini"
v-if="formData.collected == 0"
@click="addItem"
>
<i class="el-icon-star-on"></i><span>收藏</span>
</el-button>
<el-button
type="info"
size="mini"
v-if="formData.collected == 1"
@click="cancelItem"
>
<i class="el-icon-star-on"></i><span>取消收藏</span>
</el-button>
</span>
</div>
<!-- <div v-html="formData.text"></div> -->
<div id="text">
<editor v-model="formData.text" :min-height="192" />
</div>
</el-dialog>
</template>
<script>
import { mapGetters } from 'vuex';
import { add, cancel } from '@/api/search';
import Editor from '@/components/Editor';
export default {
components: {
Editor
},
data() {
return {};
},
props: {
dialogVisible: {
type: Boolean,
required: true
},
type: {
type: String,
required: true
},
formData: {
type: Object,
required: true
}
},
computed: {
...mapGetters(['token'])
},
methods: {
addItem() {
add({ policyId: this.formData.id }).then(res => {
this.formData.collected = 1;
this.msgSuccess('操作成功');
});
},
cancelItem() {
cancel({ policyId: this.formData.id }).then(res => {
this.formData.collected = 0;
this.msgSuccess('操作成功');
});
},
close() {
this.$emit('close');
}
}
};
</script>
<style lang="scss" scoped>
/deep/.el-dialog__body {
padding-top: 0;
}
.el-dialog {
.info {
display: flex;
justify-content: space-between;
}
#text {
margin-top: 30px;
/deep/.ql-toolbar {
display: none;
}
/deep/.editor {
border: 0;
}
}
}
</style>

212
src/views/home/account.vue Normal file
View File

@ -0,0 +1,212 @@
<template>
<div class="account_page">
<div class="list">
<div class="list_l">
<div class="list_icon"></div>
<span class="list_info">
<span class="text">当前手机号</span>
<span class="phone">{{ name }}</span>
</span>
</div>
<el-button
type="primary"
size="small"
@click="openDialog('修改登录手机号')"
>修改登录手机号</el-button
>
</div>
<div class="list">
<div class="list_l">
<div class="list_icon password"></div>
<span class="list_info">
<span class="text">修改密码</span>
<span class="phone">忘记密码时可通过手机验证码登录</span>
</span>
</div>
<el-button type="primary" size="small" @click="openDialog('修改密码')"
>修改密码</el-button
>
</div>
<!-- :close-on-click-modal="false" -->
<el-dialog :title="title" :visible.sync="dialogVisible" width="30%">
<el-form ref="form" :model="form" :rules="formRules" label-width="100px">
<el-form-item
label="新手机号"
prop="username"
v-if="title == '修改登录手机号'"
>
<el-input v-model.trim="form.username"></el-input>
</el-form-item>
<el-form-item
prop="code"
class="code-input"
label="验证码"
v-if="title == '修改登录手机号'"
>
<el-input
v-model="form.newPassword"
auto-complete="off"
placeholder="验证码"
style="width: 50%"
>
<svg-icon
slot="prefix"
icon-class="validCode"
class="el-input__icon input-icon"
/>
</el-input>
<el-button
@click="getCode"
type="primary"
:disabled="!show"
style="margin-left:15px"
>
获取验证码
<span v-show="!show" class="count">({{ count }}s)</span>
</el-button>
</el-form-item>
<el-form-item
label="新登录密码"
prop="password"
v-if="title == '修改密码'"
>
<el-input v-model.trim="form.password" show-password></el-input>
</el-form-item>
<el-form-item label="再次输入密码" v-if="title == '修改密码'">
<el-input v-model.trim="password" show-password></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="submitForm"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { mapGetters } from 'vuex';
import store from '@/store';
import { getAuthCode } from '@/api/login';
import { updateInfo } from '@/api/home/info';
export default {
computed: {
...mapGetters(['name'])
},
data() {
return {
dialogVisible: false,
title: '',
form: {},
TIME_COUNT: 60,
show: true,
count: '', // 初始化次数
timer: null,
password: '',
formRules: {
username: [
{ required: true, trigger: 'blur', message: '手机号不能为空' }
],
password: [{ required: true, trigger: 'blur', message: '密码不能为空' }]
}
};
},
watch: {
dialogVisible(a, b) {
if (!a) {
this.form = {};
this.password = '';
}
}
},
methods: {
openDialog(str) {
this.title = str;
this.dialogVisible = true;
},
getCode() {
this.$refs.form.validate(valid => {
if (valid) {
if (!this.timer) {
this.count = this.TIME_COUNT;
this.show = false;
getAuthCode({ phone: this.form.username }).then(res => {
console.log(res);
this.timer = setInterval(() => {
if (this.count > 0 && this.count <= this.TIME_COUNT) {
this.count--;
} else {
this.show = true;
clearInterval(this.timer); // 清除定时器
this.timer = null;
}
}, 1000);
});
}
}
});
},
submitForm() {
if (this.title == '修改密码') {
if (this.form.password !== this.password)
return this.msgError('新旧密码不一致');
}
updateInfo(this.form).then(({ message }) => {
this.msgSuccess(message);
// store.commit('SET_NAME', this.form.username);
// this.dialogVisible = false;
this.$store.dispatch('LogOut').then(() => {
location.href = '/';
});
});
// if(this.title=='修改登录手机号'){
// }else if(this.title=='修改密码'){
// }
}
},
created() {}
};
</script>
<style lang="scss" scoped>
.account_page {
.list {
display: flex;
justify-content: space-between;
align-items: center;
padding: 30px;
margin-bottom: 30px;
background-color: #fff;
.list_l {
display: flex;
.list_icon {
margin-right: 15px;
display: block;
width: 50px;
height: 50px;
text-align: center;
border-radius: 50%;
background: #f5f5f5 url(~@/assets/image/icon9.png) no-repeat center
center;
background-size: 32%;
}
.password {
background-image: url(~@/assets/image/icon10.png);
}
.list_info {
display: flex;
flex-direction: column;
font-size: 16px;
.text {
color: #999;
margin-bottom: 15px;
}
.phone {
color: #333;
}
}
}
}
}
</style>

244
src/views/home/info.vue Normal file
View File

@ -0,0 +1,244 @@
<template>
<div class="info_page">
<div class="box">
<el-form
ref="form"
:model="form"
:rules="rules"
label-width="80px"
style="width:514px"
>
<el-form-item label="企业全称">
<el-input v-model="form.companyName"></el-input>
</el-form-item>
<el-form-item label="企业行业">
<el-input v-model="form.companyType"></el-input>
</el-form-item>
<el-form-item label="用户姓名">
<el-input v-model="form.nickName"></el-input>
</el-form-item>
<el-form-item label="用户职位">
<el-input v-model="form.note"></el-input>
</el-form-item>
<el-form-item label="企业地址" required>
<el-col :span="10">
<el-form-item prop="addressType">
<el-select
v-model="form.addressType"
placeholder="请选择"
@change="handleCity"
>
<el-option
v-for="item in optionList1"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col class="line" :span="2" style="text-align: center;">-</el-col>
<el-col :span="10">
<el-form-item prop="cityId">
<el-select v-model="form.cityId" placeholder="请选择">
<el-option
v-for="item in optionList2"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
</el-form-item>
<el-form-item label="详细地址">
<el-input v-model="form.address"></el-input>
</el-form-item>
<el-form-item label="企业画像" prop="labelIdList">
<el-button size="small" @click="open">设置</el-button>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm">保存</el-button>
</el-form-item>
</el-form>
<div class="box_r">
<el-image
style="width: 100px; height: 100px;border-radius:50%"
:src="avatar"
:preview-src-list="[avatar]"
>
</el-image>
<singleUpload v-model="url" text="修改头像" />
</div>
</div>
<el-dialog title="企业画像设置" :visible.sync="dialogVisible" width="20%">
<el-form ref="form" :model="form" label-width="80px">
<el-form-item
:label="item.name"
v-for="(item, index) in labelList"
:key="item.id"
>
<el-select v-model="arr[index]" placeholder="请选择" clearable>
<el-option
v-for="i in item.labelList"
:key="i.id"
:label="i.name"
:value="i.id"
/>
</el-select>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="setIds"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { mapGetters } from 'vuex';
import store from '@/store';
import { uploadAvatar } from '@/api/user';
import {
getDictListByStatus,
updateCompanyUser,
getLabelSetting,
userInfo
} from '@/api/home/info';
import singleUpload from '@/components/Upload/singleUpload';
export default {
components: { singleUpload },
computed: {
...mapGetters(['avatar'])
},
data() {
return {
url: '',
form: {
companyName: '',
companyType: '',
nickName: '',
note: '',
addressType: '',
cityId: '',
address: '',
labelIdList: ''
},
optionList1: [
{
value: 1,
label: '地级市'
},
{
value: 2,
label: '合肥区县'
}
],
optionList2: [],
dialogVisible: false,
labelList: [],
arr: [],
rules: {
addressType: [{ required: true, message: '请选择', trigger: 'change' }],
cityId: [{ required: true, message: '请选择', trigger: 'change' }]
}
};
},
watch: {
url() {
uploadAvatar({ icon: this.url }).then(res => {
store.commit('SET_AVATAR', this.url);
});
}
},
methods: {
getUserInfo() {
userInfo().then(({ data }) => {
if (data) {
data.addressType = data.addressType - 0;
if (data.addressType == 1) {
this.getType(true, data);
} else {
this.getCity(true, data);
}
}
getLabelSetting({ companyId: data.companyId || 1 }).then(({ data }) => {
this.labelList = data;
this.arr = data.map(item =>
item.labelList
? item.labelList.filter(v => v.isHas)[0]
? item.labelList.filter(v => v.isHas)[0].id
: ''
: undefined
);
});
});
},
// 地级市切换
handleCity(e) {
this.form.cityId = '';
// 地级市
if (e === 1) {
this.getType(false);
} else {
this.getCity(false);
}
},
// 获取地级市
getType(edit, info) {
getDictListByStatus({ type: 5 }).then(({ data }) => {
this.optionList2 = data;
console.log(info);
if (edit) this.form = info;
});
},
// 获取地级市
getCity(edit, info) {
getDictListByStatus({ type: 6 }).then(({ data }) => {
this.optionList2 = data;
if (edit) this.form = info;
});
},
open() {
this.dialogVisible = true;
},
setIds() {
this.form.labelIdList = this.arr.filter(item => item);
this.dialogVisible = false;
},
submitForm() {
this.$refs['form'].validate(valid => {
if (valid) {
updateCompanyUser(this.form).then(({ message }) => {
this.msgSuccess(message);
this.getUserInfo();
});
}
});
}
},
created() {
this.getUserInfo();
}
};
</script>
<style lang="scss" scoped>
.info_page {
.box {
display: flex;
.box_r {
flex: 1;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
.el-image {
margin-bottom: 30px;
}
/deep/.el-upload-list {
display: none;
}
}
}
}
</style>

90
src/views/home/mine.vue Normal file
View File

@ -0,0 +1,90 @@
<template>
<div class="mine_page p0-100">
<div class="mine_l">
<router-link :to="item.path" v-for="(item, i) in list" :key="i">
<div :class="i == index ? 'active' : ''" @click="index = i">
{{ item.name }}
</div>
</router-link>
<div @click="logout">退出登录</div>
</div>
<div class="mine_r">
<router-view></router-view>
</div>
</div>
</template>
<script>
export default {
data() {
return {
index: 0,
list: [
{
path: '/mine/info',
name: '基本信息'
},
{
path: '/mine/account',
name: '账户安全'
},
{
path: '/mine/ollection',
name: '我的收藏'
},
{
path: '/mine/news',
name: '消息通知'
}
]
};
},
methods: {
async logout() {
this.$confirm('确定退出账号吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$store.dispatch('LogOut').then(() => {
location.href = '/';
});
});
}
}
};
</script>
<style lang="scss" scoped>
.mine_page {
display: flex;
.mine_l {
width: 310px;
max-height: 340px;
background-color: #f8f8f8;
margin-right: 10px;
border-radius: 6px;
padding: 20px 0;
div {
cursor: pointer;
font-size: 20px;
text-align: center;
height: 60px;
line-height: 60px;
}
// div:hover {
// color: #fff;
// font-weight: bold;
// background-color: #3394ff;
// }
.active {
color: #fff;
font-weight: bold;
background-color: #3394ff;
}
}
.mine_r {
flex: 1;
padding: 30px;
background-color: #f8f8f8;
}
}
</style>

5
src/views/home/news.vue Normal file
View File

@ -0,0 +1,5 @@
<template>
<div>
消息通知
</div>
</template>

View File

@ -0,0 +1,124 @@
<template>
<div class="ollection_page">
<div class="list" v-for="item in policyList" :key="item.id">
<div class="item">
<div style="max-width:520px">
<h4 class="pointer text_hidden_one" @click="handleItem(item.id)">
{{ item.title }}
</h4>
<div class="info">
<div>来源{{ item.source }}</div>
<div>发布{{ parseTime(item.textDate, '{y}-{m}-{d}') }}</div>
</div>
</div>
<div>
<el-tag effect="dark" type="warning" v-if="item.cutOffTime">
截止时间{{ parseTime(item.cutOffTime, '{y}-{m}-{d}') }}
</el-tag>
<el-button type="info" size="mini" @click="cancelItem(item.id)">
<i class="el-icon-star-on"></i><span>取消收藏</span>
</el-button>
</div>
</div>
<el-divider></el-divider>
</div>
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getPolicyList"
/>
<popup
:dialogVisible="dialogVisible"
:type="type"
:formData="formData"
@close="dialogVisible = false"
/>
</div>
</template>
<script>
import { getPolicy } from '@/api/home/info';
import { cancel } from '@/api/search';
import { getPolicyInfo } from '@/api/search';
import popup from '../components/dialog';
export default {
components: {
popup
},
data() {
return {
queryParams: {
pageNum: 1,
pageSize: 10
},
total: 0,
policyList: [],
dialogVisible: false,
type: 'policy',
formData: {}
};
},
watch: {
dialogVisible(a, b) {
// getPolicyList
if (!a) {
this.formData = {};
this.getPolicyList();
}
},
formData: {
handler: function() {
this.$nextTick(() => {
this.formatRichText(this.formData.downloadUrl);
});
}
},
deep: true
},
methods: {
getPolicyList() {
getPolicy(this.queryParams).then(({ data }) => {
this.policyList = data.list;
this.total = data.total;
});
},
handleItem(id) {
this.dialogVisible = true;
getPolicyInfo({ policyId: id }).then(({ data }) => {
this.formData = data;
});
},
cancelItem(policyId) {
cancel({ policyId }).then(res => {
this.msgSuccess('操作成功');
this.getPolicyList();
});
}
},
created() {
this.getPolicyList();
}
};
</script>
<style lang="scss" scoped>
.ollection_page {
min-height: 280px;
background-color: #fff;
padding: 15px;
.list {
.item {
display: flex;
justify-content: space-between;
align-items: center;
.el-tag {
margin-right: 10px;
}
.info {
display: flex;
justify-content: space-between;
}
}
}
}
</style>

View File

@ -0,0 +1,176 @@
<template>
<div>
<img
v-bind:src="options.img"
@click="editCropper()"
title="点击上传头像"
class="img-circle img-lg"
/>
<el-dialog
:title="title"
:visible.sync="open"
width="800px"
append-to-body
@opened="modalOpened"
>
<el-row>
<el-col :xs="24" :md="12" :style="{ height: '350px' }">
<vue-cropper
ref="cropper"
:img="options.img"
:info="true"
:autoCrop="options.autoCrop"
:autoCropWidth="options.autoCropWidth"
:autoCropHeight="options.autoCropHeight"
:fixedBox="options.fixedBox"
@realTime="realTime"
v-if="visible"
/>
</el-col>
<el-col :xs="24" :md="12" :style="{ height: '350px' }">
<div class="avatar-upload-preview">
<img :src="previews.url" :style="previews.img" />
</div>
</el-col>
</el-row>
<br />
<el-row>
<el-col :lg="2" :md="2">
<el-upload
action="#"
:http-request="requestUpload"
:show-file-list="false"
:before-upload="beforeUpload"
>
<el-button size="small">
上传
<i class="el-icon-upload el-icon--right"></i>
</el-button>
</el-upload>
</el-col>
<el-col :lg="{ span: 1, offset: 2 }" :md="2">
<el-button
icon="el-icon-plus"
size="small"
@click="changeScale(1)"
></el-button>
</el-col>
<el-col :lg="{ span: 1, offset: 1 }" :md="2">
<el-button
icon="el-icon-minus"
size="small"
@click="changeScale(-1)"
></el-button>
</el-col>
<el-col :lg="{ span: 1, offset: 1 }" :md="2">
<el-button
icon="el-icon-refresh-left"
size="small"
@click="rotateLeft()"
></el-button>
</el-col>
<el-col :lg="{ span: 1, offset: 1 }" :md="2">
<el-button
icon="el-icon-refresh-right"
size="small"
@click="rotateRight()"
></el-button>
</el-col>
<el-col :lg="{ span: 2, offset: 6 }" :md="2">
<el-button type="primary" size="small" @click="uploadImg()"
> </el-button
>
</el-col>
</el-row>
</el-dialog>
</div>
</template>
<script>
import store from '@/store';
import { VueCropper } from 'vue-cropper';
import { uploadAvatar } from '@/api/user';
export default {
components: { VueCropper },
props: {
user: {
type: Object
}
},
data() {
return {
// 是否显示弹出层
open: false,
// 是否显示cropper
visible: false,
// 弹出层标题
title: '修改头像',
options: {
img: store.getters.avatar, //裁剪图片的地址
autoCrop: true, // 是否默认生成截图框
autoCropWidth: 200, // 默认生成截图框宽度
autoCropHeight: 200, // 默认生成截图框高度
fixedBox: true // 固定截图框大小 不允许改变
},
previews: {}
};
},
methods: {
// 编辑头像
editCropper() {
this.open = true;
},
// 打开弹出层结束时的回调
modalOpened() {
this.visible = true;
},
// 覆盖默认的上传行为
requestUpload() {},
// 向左旋转
rotateLeft() {
this.$refs.cropper.rotateLeft();
},
// 向右旋转
rotateRight() {
this.$refs.cropper.rotateRight();
},
// 图片缩放
changeScale(num) {
num = num || 1;
this.$refs.cropper.changeScale(num);
},
// 上传预处理
beforeUpload(file) {
if (file.type.indexOf('image/') == -1) {
this.msgError('文件格式错误,请上传图片类型,如JPGPNG后缀的文件。');
} else {
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = () => {
this.options.img = reader.result;
};
}
},
// 上传图片
uploadImg() {
this.$refs.cropper.getCropBlob(data => {
debugger;
let formData = new FormData();
formData.append('avatarfile', data);
uploadAvatar(formData).then(response => {
this.open = false;
this.options.img = process.env.VUE_APP_BASE_API + response.imgUrl;
store.commit('SET_AVATAR', this.options.img);
this.msgSuccess('修改成功');
this.visible = false;
});
});
},
// 实时预览
realTime(data) {
this.previews = data;
}
}
};
</script>

View File

@ -41,7 +41,7 @@
<i class="mark">|</i>
<el-button type="text" @click="handlePage">注册</el-button>
</div>
<div class="avatar-wrapper" v-else>
<div class="avatar-wrapper" v-else @click="handlePath('/mine')">
<img :src="avatar" class="user-avatar" />
</div>
<div class="img2_box">
@ -50,6 +50,7 @@
<el-input
v-model.trim="input"
placeholder="请输入搜索关键字"
@keyup.enter.native="toSearch"
></el-input>
<el-button type="warning" @click="toSearch">一站搜</el-button>
<!-- <router-link

View File

@ -40,57 +40,27 @@
</div>
</div>
</div>
<el-dialog title="" :visible.sync="dialogVisible" width="70%">
<h2>{{ formData.title }}</h2>
<div class="info" v-if="type != 'information'">
<span v-if="type != 'companyNeed' && type != 'scienceResult'"
>来源{{ formData.source }}</span
>
<span v-if="type == 'companyNeed'">价格{{ formData.price }}</span>
<el-image
v-if="type == 'scienceResult'"
style="width: 100px; height: 100px"
:src="formData.picList ? formData.picList[0] : ''"
fit="cover"
:preview-src-list="formData.picList"
></el-image>
<span
>发布{{
formData.listDate || parseTime(formData.createTime, '{y}-{m}-{d}')
}}</span
>
<span v-if="token && type == 'policy'">
<el-button type="primary" size="mini">
<i class="el-icon-star-on"></i><span>收藏</span>
</el-button>
<el-button type="info" size="mini">
<i class="el-icon-star-on"></i><span>取消收藏</span>
</el-button>
</span>
</div>
<!-- <div v-html="formData.text"></div> -->
<div id="text">
<editor v-model="formData.text" :min-height="192" />
</div>
</el-dialog>
<popup
:dialogVisible="dialogVisible"
:type="type"
:formData="formData"
@close="dialogVisible = false"
/>
</div>
</template>
<script>
import { mapGetters } from 'vuex';
import Editor from '@/components/Editor';
import {
search,
getPolicyInfo,
getPolicyReadInfo,
getInfo,
getInfo2,
getInfo3,
add,
cancel
getInfo3
} from '@/api/search';
import popup from './components/dialog';
export default {
components: {
Editor
popup
},
data() {
return {
@ -100,9 +70,6 @@ export default {
type: ''
};
},
computed: {
...mapGetters(['token'])
},
watch: {
dialogVisible(a, b) {
if (!a) this.formData = {};
@ -158,25 +125,6 @@ export default {
</script>
<style lang="scss" scoped>
.search_page {
/deep/.el-dialog__body {
padding-top: 0;
}
.el-dialog {
.info {
display: flex;
justify-content: space-between;
}
#text {
margin-top: 30px;
/deep/.ql-toolbar {
display: none;
}
/deep/.editor {
border: 0;
}
}
}
.content {
padding: 20px 30px;
.item {