Browse Source

feat: 项目创建分享链接

project
song 4 years ago
parent
commit
eb2c4ba4d2
  1. 17
      CHANGELOG.md
  2. 1
      package.json
  3. 6
      src/apis/project.js
  4. 231
      src/components/ShareProject/ShareProject.vue
  5. 222
      src/components/Title/Title.vue
  6. 3
      src/main.js

17
CHANGELOG.md

@ -150,6 +150,7 @@
范围|描述|commitId
--|--|--
- | README.md | [ab0eb05](https://dd.tall.wiki/gitea/wally/tall-mui-3-project/commits/ab0eb05)
- | 新建项目,分享项目样式修改 | [4524d4a](https://dd.tall.wiki/gitea/wally/tall-mui-3-project/commits/4524d4a)
### 🔧 测试
@ -193,25 +194,12 @@
- | 整理代码 | [7a55315](https://dd.tall.wiki/gitea/wally/tall-mui-3-project/commits/7a55315)
- | 日历的更改 | [7353ac8](https://dd.tall.wiki/gitea/wally/tall-mui-3-project/commits/7353ac8)
- | 测试接口 | [215e074](https://dd.tall.wiki/gitea/wally/tall-mui-3-project/commits/215e074)
- | 添加弹框动画 | [8903854](https://dd.tall.wiki/gitea/wally/tall-mui-3-project/commits/8903854)
- | 组件文件夹新建 | [22bfe7b](https://dd.tall.wiki/gitea/wally/tall-mui-3-project/commits/22bfe7b)
- | 组件文件夹新建 | [17bb8c9](https://dd.tall.wiki/gitea/wally/tall-mui-3-project/commits/17bb8c9)
- | 组件文件夹新建 | [1421504](https://dd.tall.wiki/gitea/wally/tall-mui-3-project/commits/1421504)
- | 角色栏文字颜色修改 | [215c6b3](https://dd.tall.wiki/gitea/wally/tall-mui-3-project/commits/215c6b3)
- | 解决警告 | [c932b09](https://dd.tall.wiki/gitea/wally/tall-mui-3-project/commits/c932b09)
- | 1.时间轴筛选相同的时间替换数据 2.整理代码 | e082ccb
- | 测试接口 | 215e074
- | 插件查询及展示 | 4dba770
- | 角色栏文字颜色修改 | 215c6b3
- | 解决警告 | c932b09
- | 日历的更改 | 7353ac8
- | 小红点api缓存修改 | e992343
- | 修改代码格式 | 14123d7
- | 修改定期任务骨架屏高度 | 909a734
- | 修改样式 | 322b0fb
- | 整理代码 | 7a55315
- | 组件文件夹新建 | 22bfe7b
- | 组件文件夹新建 | 17bb8c9
- | 组件文件夹新建 | 1421504
### chore
@ -237,3 +225,4 @@
- | style:index | [978f272](https://dd.tall.wiki/gitea/wally/tall-mui-3-project/commits/978f272)
- | !2 基础模板v1.1.0 | [f5e61dd](https://dd.tall.wiki/gitea/wally/tall-mui-3-project/commits/f5e61dd)
- | init | [c0f1deb](https://dd.tall.wiki/gitea/wally/tall-mui-3-project/commits/c0f1deb)

1
package.json

@ -42,6 +42,7 @@
"regenerator-runtime": "^0.12.1",
"uview-ui": "^1.8.4",
"vue": "^2.6.11",
"vue-clipboard2": "^0.3.1",
"vuex": "^3.2.0"
},
"devDependencies": {

6
src/apis/project.js

@ -2,6 +2,12 @@ const install = (Vue, vm) => {
vm.$u.api = { ...vm.$u.api } || {};
//根据id获取项目信息
vm.$u.api.findProjectById = param => vm.$u.post(`${uni.$t.domain}/project/findProjectById`, param);
//创建分享连接
vm.$u.api.createShare = param => vm.$u.post(`${uni.$t.domain}/share/create`, param);
//点击分享连接
vm.$u.api.clickShare = param => vm.$u.post(`${uni.$t.domain}/share/click`, param);
};
export default { install };

231
src/components/ShareProject/ShareProject.vue

@ -0,0 +1,231 @@
<template>
<view class="secondPopup flex justify-center">
<view class="content p-3 pb-8">
<view class="mb-3 font-bold text-base flex justify-center">创建分享链接</view>
<view class="flex flex-col">
<view class="mb-1">用户以什么角色加入项目</view>
<!-- 下拉多选 -->
<u-dropdown>
<u-dropdown-item v-model="roleValue" :title="roleValue" :options="allRoles" @change="changeRole"></u-dropdown-item>
</u-dropdown>
<!-- 复制链接 -->
<view class="link flex items-center mt-4">
<view class="link-url">{{ links }}</view>
<!-- <u-button style="border-radius: 0" type="primary" @click="copyPasteboard">复制链接</u-button> -->
<u-button
style="border-radius: 0"
type="primary"
v-clipboard:copy="links"
v-clipboard:success="copySuccess"
v-clipboard:error="copyError"
>
复制链接
</u-button>
</view>
<view @click="select">
<!-- 全选按钮 -->
<!-- <view class="flex mt-4">
<view>
<u-checkbox-group>
<u-checkbox v-model="checked" @change="checkedAll"></u-checkbox>
</u-checkbox-group>
</view>
<view>已选择({{ this.quantity }})</view>
<view style="color: #f37378; margin-left: 20px">批量删除</view>
</view> -->
<!-- 多选框 -->
<!-- <view>
<u-checkbox-group class="checkboxs flex flex-1 items-center mt-4" v-for="(item, index) in list" :key="index">
<div class="flex-1 flex items-center">
<u-checkbox v-model="item.checked"></u-checkbox>
<u-avatar :src="item.src" size="55" style="background: #d8dce0; margin-right: 10px"></u-avatar>
<div style="width: 60%; font-size: 12px">
<div style="color: gray">{{ item.name }}</div>
<div style="color: #c4d0e1">{{ item.joinMethod }}</div>
</div>
</div>
</u-checkbox-group>
</view> -->
</view>
</view>
</view>
</view>
</template>
<script>
import { mapGetters, mapState } from 'vuex';
export default {
data() {
return {
roleValue: '观众',
links: 'https://kdocs.cn/l/cbs', //
checked: false, //
//
list: [
{
name: '冯老师',
src: '',
joinMethod: '文件创建者',
role: '观众',
checked: false,
disabled: false,
},
{
name: '马壮',
src: '',
joinMethod: '通过链接加入',
role: '干系人',
checked: false,
disabled: false,
},
{
name: '张野',
src: '',
joinMethod: '通过链接加入',
role: '观众',
checked: false,
disabled: false,
},
],
quantity: 0, //
path: '',
};
},
computed: {
...mapState('role', ['visibleRoles', 'invisibleRoles']),
...mapGetters('project', ['projectId']),
allRoles() {
let newArr = [];
if (this.visibleRoles.length || this.invisibleRoles.length) {
const arr = this.visibleRoles.concat(this.invisibleRoles);
arr.forEach(role => {
let item = { value: '', label: '' };
item.id = role.id;
item.value = role.name;
item.label = role.name;
newArr.push(item);
});
const firstItem = { id: '0', value: '观众', label: '观众' };
newArr.unshift(firstItem);
}
return newArr;
},
},
async created() {
this.path = window.location.href.split('?')[0];
const { path, projectId } = this;
const params = { path, projectId, roleId: '0' };
await this.creatShare(params);
},
methods: {
//
async changeRole(value) {
this.roleValue = value;
const role = this.allRoles.find(item => item.value == value);
const { path, projectId } = this;
const params = { path, projectId, roleId: role.id };
await this.creatShare(params);
},
//
copySuccess() {
this.$t.ui.showToast('复制成功');
},
//
copyError() {
this.$t.ui.showToast('复制失败,请稍后重试');
},
/**
* 创建分享链接
* @param path 路径前缀
* @param projectId 项目id
* @param roleId 角色id
*/
async creatShare(params) {
try {
const data = await this.$u.api.createShare(params);
this.links = data.path;
} catch (error) {
console.error('error: ', error);
}
},
//
copyPasteboard() {
uni.setClipboardData({
data: this.links,
success: function (res) {
console.log('链接复制成功', res.data);
},
});
},
//
select() {
this.quantity = 0;
this.list.forEach(val => {
if (val.checked == true) {
this.quantity++;
}
});
},
//
checkedAll() {
this.list.map(val => {
val.checked = !this.checked;
});
},
},
};
</script>
<style lang="scss" scoped>
.content {
width: 330px;
max-height: 400px;
}
.link {
height: 40px;
border: 1px solid #afbed1;
}
.link-url {
color: #afbed1;
width: 80%;
line-height: 40px;
margin-left: 5px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
/deep/ .u-slot-content {
min-width: 0;
}
/deep/ .u-dropdown__content {
height: 160px !important;
overflow-y: auto;
background: #fff !important;
transition: none !important;
}
/deep/.u-dropdown__menu__item .u-flex {
justify-content: space-between;
width: 100%;
height: 100%;
flex-wrap: nowrap;
border: 1px solid #afbed1;
padding: 0 8px;
}
/deep/.u-dropdown__content__mask {
display: none;
}
</style>

222
src/components/Title/Title.vue

@ -29,64 +29,9 @@
</view>
</view>
<!-- 分享项目弹窗 -->
<view class="secondPopup flex justify-center" v-if="secondShow">
<view class="content">
<view class="popupTitle flex justify-center">创建分享链接</view>
<view>选择以什么角色分享项目</view>
<!-- 下拉多选 -->
<view>
<u-dropdown ref="uDropdown">
<u-dropdown-item :title="dropTitle">
<view class="slot-content" style="background-color: #ffffff; height: auto">
<div
class="multiple-choice flex flex-row justify-between"
v-for="(option, optionIndex) in options"
:key="optionIndex"
@click="change(optionIndex)"
>
<view v-model="option.value">{{ option.label }}</view>
<u-icon v-if="option.dropdownShow" name="checkbox-mark" color="#2979ff" size="28"></u-icon>
</div>
<u-button type="primary" @click="closeDropdown">确定</u-button>
</view>
</u-dropdown-item>
</u-dropdown>
</view>
<!-- 复制链接 -->
<view class="link flex items-center">
<view style="color: #afbed1; width: 80%; margin-left: 5px">{{ links }}</view>
<u-button style="border-radius: 0" type="primary" @click="copyPasteboard">复制链接</u-button>
</view>
<view @click="select">
<!-- 全选按钮 -->
<view class="flex mt-4">
<view>
<u-checkbox-group>
<u-checkbox v-model="checked" @change="checkedAll"></u-checkbox>
</u-checkbox-group>
</view>
<view>已选择({{ this.quantity }})</view>
<view style="color: #f37378; margin-left: 20px">批量删除</view>
</view>
<!-- 多选框 -->
<view>
<u-checkbox-group class="checkboxs flex flex-1 items-center mt-4" v-for="(item, index) in list" :key="index">
<div class="flex-1 flex items-center">
<u-checkbox v-model="item.checked"></u-checkbox>
<u-avatar :src="item.src" size="55" style="background: #d8dce0; margin-right: 10px"></u-avatar>
<div style="width: 60%; font-size: 12px">
<div style="color: gray">{{ item.name }}</div>
<div style="color: #c4d0e1">{{ item.joinMethod }}</div>
</div>
</div>
</u-checkbox-group>
</view>
</view>
</view>
</view>
<ShareProject v-if="secondShow" class="secondPopup" />
<!-- 新建项目弹窗 -->
<NewProjects class="thirdPopup flex transition-transform" v-if="newProjectsShow" />
<NewProjects @closeMask="closeMask" class="thirdPopup flex transition-transform" v-if="newProjectsShow" />
</view>
</template>
@ -98,62 +43,10 @@ export default {
components: { NewProjects },
data() {
return {
checked: false, //
show: false, // ...
newProjectsShow: false, //
secondShow: false, //
maskShow: false, //
dropTitle: '观众,干系人', //
links: 'https://kdocs.cn/l/cbs', //
quantity: 0, //
//
options: [
{
label: '观众',
value: 1,
dropdownShow: false,
status: false,
},
{
label: '距离优先',
value: 2,
dropdownShow: false,
status: false,
},
{
label: '价格优先',
value: 3,
dropdownShow: false,
status: false,
},
],
//
list: [
{
name: '冯老师',
src: '',
joinMethod: '文件创建者',
role: '观众',
checked: false,
disabled: false,
},
{
name: '马壮',
src: '',
joinMethod: '通过链接加入',
role: '干系人',
checked: false,
disabled: false,
},
{
name: '张野',
src: '',
joinMethod: '通过链接加入',
role: '观众',
checked: false,
disabled: false,
},
],
};
},
computed: {
@ -161,20 +54,7 @@ export default {
...mapGetters('user', ['userId']),
},
mounted() {
this.select;
},
created() {
this.select;
},
methods: {
//
closeDropdown() {
this.$refs.uDropdown.close();
},
//
onBack() {
// eslint-disable-next-line no-undef
@ -233,64 +113,11 @@ export default {
//
this.newProjectsShow = false;
},
//
change(optionIndex) {
console.log(optionIndex);
let arr = [...this.options];
//
arr[optionIndex].dropdownShow = !arr[optionIndex].dropdownShow;
//
this.dropTitle = arr[optionIndex].label;
let shows = '';
// arr
arr.map(val => {
if (val.dropdownShow === true) {
shows += val.label + ',';
}
});
this.options = [...arr];
// ','
this.dropTitle = shows.slice(0, shows.length - 1);
console.log(this.dropTitle);
// this.dropTitle = arr[value - 1].label;
},
//
copyPasteboard() {
uni.setClipboardData({
data: this.links,
success: function () {
console.log('链接复制成功');
},
});
},
//
checkedAll() {
this.list.map(val => {
val.checked = !this.checked;
});
},
//
select() {
this.quantity = 0;
this.list.forEach(val => {
if (val.checked == true) {
this.quantity++;
}
});
},
},
};
</script>
<style lang="scss" scoped>
.multiple-choice {
padding: 5px;
}
.secondPopup {
background: #ffffff;
position: fixed;
@ -300,6 +127,7 @@ export default {
z-index: 33;
border-radius: 5px;
}
.thirdPopup {
background: #ffffff;
position: fixed;
@ -309,25 +137,13 @@ export default {
border-radius: 5px;
transform: translate(-50%, -50%);
}
.content {
width: 330px;
border: 1px solid #b4b4b4;
// background: white;
padding: 15px;
}
.popupTitle {
font-size: 16px;
font-weight: bold;
margin-bottom: 5px;
}
.popup {
width: 40%;
background: #fff;
position: absolute;
right: 0;
z-index: 22;
z-index: 99;
padding: 15px;
color: black;
animation: opacity 1s ease-in;
@ -345,34 +161,22 @@ export default {
}
}
.link {
height: 40px;
border: 1px solid #afbed1;
margin-top: 15px;
}
.checkboxs {
width: 100%;
}
/deep/ .u-slot-content {
min-width: 0;
}
/deep/.u-dropdown__menu__item > uni-view {
/deep/ .u-dropdown__content {
height: 160px !important;
overflow-y: auto;
background: #fff !important;
transition: none !important;
}
/deep/.u-dropdown__menu__item .u-flex {
justify-content: space-between;
width: 100%;
height: 100%;
flex-wrap: nowrap;
border: 1px solid #afbed1;
padding: 5px;
}
/deep/.u-dropdown__content__mask[data-v-01c0c507] {
/* background: rgba(0, 0, 0, 0.3); */
width: 100%;
}
/deep/.u-avatar[data-v-b36130f2] {
width: 30px;
height: 30px;
font-size: 12px;
padding: 0 8px;
}
/deep/.u-dropdown__content__mask {
display: none;

3
src/main.js

@ -1,6 +1,7 @@
import App from './App';
import Tall from '@/utils/tall';
import Vue from 'vue';
import VueClipboard from 'vue-clipboard2';
import dayjs from 'dayjs';
import plugin from '@/apis/plugin.js';
import project from '@/apis/project.js';
@ -22,6 +23,8 @@ import wbs from '@/apis/wbs.js';
// Vue.use(indexedDB);
//#endif
Vue.use(VueClipboard);
Vue.config.productionTip = false;
Vue.prototype.$moment = dayjs;
Vue.use(uView);

Loading…
Cancel
Save