Browse Source

feat: 流水账插件

text-draggable
xuesinan 4 years ago
parent
commit
831c44871b
  1. 1
      .eslintrc.js
  2. 1
      src/App.vue
  3. 2
      src/components/tall/Render/Render.vue
  4. 4
      src/components/tall/center/Roles.vue
  5. 10
      src/components/tall/plugin/Plugin.vue
  6. 1
      src/components/tall/top/TopNavbar.vue
  7. 163
      src/plugins/p-daily-account-detail.vue
  8. 18
      src/plugins/p-daily-account.vue
  9. 11
      src/store/tall/task/index.js
  10. 13
      src/store/tall/user/index.js
  11. 6
      src/utils/axios.js
  12. 21
      src/views/detail/Test.vue
  13. 14
      src/views/home/Index.vue
  14. 1
      src/views/user/SignIn.vue

1
.eslintrc.js

@ -11,6 +11,7 @@ module.exports = {
parser: "vue-eslint-parser", // 添加这一句
plugins: ['vue'],
rules: {
'no-unused-vars': 'off',
'no-loop-func': 'off',
'import/no-unresolved': 0,
'import/extensions': 0,

1
src/App.vue

@ -19,6 +19,7 @@ store.commit('layout/setDeviceId', uuidv4().split('-')[0]);
if (userString) {
const user = JSON.parse(userString);
store.commit('user/setUser', user);
store.commit('user/setToken', user && user.token ? user.token : '');
}
//

2
src/components/tall/Render/Render.vue

@ -41,7 +41,7 @@ const userId = computed(() => store.getters['user/userId']);
const roleId = computed(() => store.state.role.roleId); // id
const allPlugin = computed(() => store.state.layout.allPlugin); //
const businessPlugin = computed(() => store.state.layout.businessPlugin); //
const token = store.getters['user/token'];
const token = computed(() => store.state.user.token); // token
const pluginInfo = ref(null);

4
src/components/tall/center/Roles.vue

@ -79,6 +79,10 @@ function changeRole(item) {
store.commit('task/clearRealTasks');
store.commit('task/setUpNextPage', 1);
store.commit('task/setDownNextPage', 1);
//
store.commit('task/setTaskDetailUrl', '');
sessionStorage.setItem('targetUrl', '');
store.commit('task/setTaskDetailShow', '');
}
</script>

10
src/components/tall/plugin/Plugin.vue

@ -3,18 +3,27 @@
<!-- 交付物插件 -->
<p-deliver v-else-if="pluginId === '15'" />
<!-- <p-deliver-second v-else-if="pluginId === '15'" /> -->
<!-- 资源管理 -->
<!-- <p-source-manage v-else-if="pluginId === '16'" class="p-2" /> -->
<!-- 财务审批统计 -->
<!-- <p-finance-audit v-else-if="pluginId === '17'" class="p-2" /> -->
<!-- 财务条 -->
<!-- <p-finance v-else-if="pluginId === '18'" class="p-2" /> -->
<!-- 个人和终端按钮-->
<!-- <p-account-management v-else-if="pluginId === '19'" class="p-2" /> -->
<!-- 与资源管理 -->
<!-- <p-domain-source-manage v-else-if="pluginId === '20'" class="p-2" /> -->
<!-- 项目版本管理 -->
<!-- <p-project-version-management v-else-if="pluginId === '21'" class="p-2" /> -->
<!-- 任务名和跳转详情页箭头 -->
<!-- <p-task-to-detail :task="task" v-else-if="pluginId === '24'" class="p-2"></p-task-to-detail> -->
<!-- 流水账插件 -->
<p-daily-account v-else-if="pluginId === '16'"></p-daily-account>
<Render
v-else
:task="task"
@ -31,6 +40,7 @@ import { provide, defineProps } from 'vue';
// import { useStore } from 'vuex';
import pTaskTitle from '@/plugins/p-task-title.vue';
import pDeliver from '@/plugins/p-deliver.vue';
import pDailyAccount from '@/plugins/p-daily-account.vue';
const props = defineProps({
task: { default: () => {}, type: Object },

1
src/components/tall/top/TopNavbar.vue

@ -44,6 +44,7 @@ function signUp() {
function signOut() {
store.commit('user/setUser', null);
store.commit('projects/setProject', null);
store.commit('user/setToken', '');
// store.commit('task/setTaskDetail', null);
// router.push({ path: '/experiment/user/signin' });
}

163
src/plugins/p-daily-account-detail.vue

@ -0,0 +1,163 @@
<template>
<div class="p-4">
<div class="mb-8 flex justify-between items-center">
<div class="text-2xl font-semibold">流水账</div>
<div class="flex items-center">
<a-button type="primary">早打卡</a-button>
<a-button class="mx-5" type="primary">晚打卡</a-button>
<FullscreenExitOutlined class="text-lg" style="color: #777" />
</div>
</div>
<a-form class="flex flex-wrap" :model="formState" name="basic" autocomplete="off" @finish="onFinish" @finishFailed="onFinishFailed">
<a-form-item name="timeRange" label="时间" style="width: 250px; margin-right: 20px">
<a-range-picker v-model:value="formState.timeRange" />
</a-form-item>
<a-form-item name="staffRange" label="员工" style="width: 250px; margin-right: 20px">
<a-select
v-model:value="formState.staffRange"
:options="options"
mode="multiple"
placeholder="请选择员工"
@popupScroll="popupScroll"
></a-select>
</a-form-item>
<a-form-item name="programName" label="项目" style="width: 250px; margin-right: 20px">
<a-select
v-model:value="formState.programName"
:options="options"
mode="multiple"
placeholder="请输入项目名称"
@popupScroll="popupScroll"
></a-select>
</a-form-item>
<!-- <a-form-item :wrapper-col="{ offset: 8, span: 16 }">
<a-button type="primary">筛选</a-button>
<a-button class="mx-3" type="primary">导出</a-button>
<a-button>重置</a-button>
</a-form-item> -->
</a-form>
<div>
<a-button type="primary">筛选</a-button>
<a-button class="mx-3" type="primary">导出</a-button>
<a-button>重置</a-button>
</div>
<a-table :columns="columns" :data-source="data" :scroll="{ x: 1500, y: 300 }">
<template #bodyCell="{ column }">
<template v-if="column.key === 'operation'">
<a>action</a>
</template>
</template>
</a-table>
</div>
</template>
<script setup>
import { reactive } from 'vue';
import { FullscreenExitOutlined } from '@ant-design/icons-vue';
const formState = reactive({
timeRange: [], //
staffRange: ['a1', 'b2'], //
programName: ['a1', 'b2'], //
});
const options = [...Array(25)].map((_, i) => ({ value: (i + 10).toString(36) + (i + 1) }));
const columns = [
{
title: 'Full Name',
width: 100,
dataIndex: 'name',
key: 'name',
fixed: 'left',
},
{
title: 'Age',
width: 100,
dataIndex: 'age',
key: 'age',
fixed: 'left',
},
{
title: 'Column 1',
dataIndex: 'address',
key: '1',
width: 150,
},
{
title: 'Column 2',
dataIndex: 'address',
key: '2',
width: 150,
},
{
title: 'Column 3',
dataIndex: 'address',
key: '3',
width: 150,
},
{
title: 'Column 4',
dataIndex: 'address',
key: '4',
width: 150,
},
{
title: 'Column 5',
dataIndex: 'address',
key: '5',
width: 150,
},
{
title: 'Column 6',
dataIndex: 'address',
key: '6',
width: 150,
},
{
title: 'Column 7',
dataIndex: 'address',
key: '7',
width: 150,
},
{
title: 'Column 8',
dataIndex: 'address',
key: '8',
},
{
title: 'Action',
key: 'operation',
fixed: 'right',
width: 100,
},
];
const data = [];
for (let i = 0; i < 100; i++) {
data.push({
key: i,
name: `Edrward ${i}`,
age: 32,
address: `London Park no. ${i}`,
});
}
const popupScroll = () => {
console.log('popupScroll');
};
const onFinish = values => {
console.log('Success:', values);
};
const onFinishFailed = errorInfo => {
console.log('Failed:', errorInfo);
};
</script>

18
src/plugins/p-daily-account.vue

@ -0,0 +1,18 @@
<template>
<view class="w-full block text-center">
<a-button type="primary" style="width: 250px" @click="openDailyAccount">流水账</a-button>
</view>
</template>
<script setup>
import { useStore } from 'vuex';
const store = useStore();
function openDailyAccount() {
store.commit('task/setTaskDetailUrl', '');
sessionStorage.setItem('targetUrl', '');
store.commit('task/setTaskDetailShow', 'dailyAccount');
sessionStorage.setItem('taskDetailShow', 'dailyAccount');
}
</script>

11
src/store/tall/task/index.js

@ -35,6 +35,7 @@ export default {
upNextPage: 1, // 向上下一页的值
downNextPage: 1, // 向下下一页的值
taskDetailUrl: '', // iframe详情页链接
taskDetailShow: '', // 内置组件详情页显示
},
getters: {
@ -402,6 +403,16 @@ export default {
setTaskDetailUrl(state, data) {
state.taskDetailUrl = data;
},
/**
* 设置内置组件详情页显示
* @param {Object} state
* @param {Object} data
*/
setTaskDetailShow(state, data) {
state.taskDetailShow = data;
console.log('taskDetailShow', state.taskDetailShow);
},
},
actions: {},

13
src/store/tall/user/index.js

@ -5,7 +5,7 @@ import { message } from 'ant-design-vue';
export default {
namespaced: true,
state: { user: null, count: 3 },
state: { user: null, token: '', count: 3 },
getters: {
token({ user }) {
@ -39,6 +39,15 @@ export default {
}
},
/**
* 设置token值
* @param {*} state
* @param {*} data
*/
setToken(state, data) {
state.token = data;
},
/**
* 设置token过期重新请求次数
*/
@ -68,7 +77,7 @@ export default {
* 根据refreshToken重新获取token
* @param {string} refreshToken
*/
async getTokenByRefreshToken(refreshToken) {
async getTokenByRefreshToken({ commit }, refreshToken) {
try {
const data = await getNewToken(refreshToken);
return data;

6
src/utils/axios.js

@ -13,7 +13,7 @@ const instance = Axios.create({
// request
instance.interceptors.request.use(
config => {
const token = store.getters['user/token'] || sessionStorage.getItem('token');
const token = store.state.user.token || sessionStorage.getItem('token');
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
@ -36,6 +36,7 @@ instance.interceptors.response.use(
const resData = response.data.data;
if (code === 200) {
if (tokenObj.token) {
store.commit('user/setToken', tokenObj.token);
sessionStorage.setItem('token', tokenObj.token);
sessionStorage.setItem('refreshToken', tokenObj.refreshToken);
}
@ -57,13 +58,14 @@ instance.interceptors.response.use(
store.commit('user/setCount', 3);
}
return res;
return res.data.data;
}
if (code === 401) {
// refreshToken过期
sessionStorage.removeItem('token');
sessionStorage.removeItem('refreshToken');
store.commit('user/setUser', null);
store.commit('user/setToken', '');
message.error(msg);
setTimeout(() => {
router.push({ path: '/user/signin' });

21
src/views/detail/Test.vue

@ -1,22 +1,21 @@
<template>
<div class="task-detail">
<DetailWebview></DetailWebview>
<!-- <div class="task-con flex"> -->
<!-- {{ taskInfo.name }} -->
<!-- <div class="task-con-box"> -->
<!-- <div>{{ label }}</div> -->
<DetailWebview v-if="taskDetailUrl"></DetailWebview>
<!-- </div> -->
<!-- <div class="task-con-list" v-if="isShowList">
<TaskConList />
</div> -->
<!-- </div> -->
<p-daily-account-detail v-if="taskDetailShow === 'dailyAccount'"></p-daily-account-detail>
</div>
</template>
<script setup>
import { computed } from 'vue';
import { useStore } from 'vuex';
import DetailWebview from '@/components/tall/Right/DetailWebview.vue';
import pDailyAccountDetail from '@/plugins/p-daily-account-detail.vue';
const store = useStore();
const taskDetailUrl = computed(() => store.state.task.taskDetailUrl); // iframe
const taskDetailShow = computed(() => store.state.task.taskDetailShow); //
</script>
<style scoped>

14
src/views/home/Index.vue

@ -11,7 +11,7 @@
<a-layout-sider v-if="projectInfo.id" class="project-detail"><Center /></a-layout-sider>
<a-layout v-if="taskDetailUrl">
<a-layout v-if="projectInfo.id && (taskDetailUrl || taskDetailShow)">
<!-- 导航栏 - 详情页导航 -->
<!-- <a-layout-header style="background: #fff">
<Navbar />
@ -48,18 +48,26 @@ const sessionProject = sessionStorage.getItem('project'); // 项目信息缓存
// const taskDetail = computed(() => store.state.task.taskDetail); //
const taskDetailUrl = computed(() => store.state.task.taskDetailUrl); // iframe
const targetUrl = sessionStorage.getItem('targetUrl'); //
const taskDetailShow = computed(() => store.state.task.taskDetailShow); //
const sessionTaskDetailShow = sessionStorage.getItem('taskDetailShow'); //
if (sessionProject && !projectInfo.value.id) {
const info = JSON.parse(sessionProject);
console.log(`info`, info);
store.commit('projects/setProject', info);
store.commit('task/setBusinessCode', info.businessCode);
store.commit('task/setBusinessCode', info && info.businessCode ? info.businessCode : '');
}
if (targetUrl) {
//
if (targetUrl && !taskDetailUrl.value) {
store.commit('task/setTaskDetailUrl', targetUrl);
}
//
if (sessionTaskDetailShow && !taskDetailShow.value) {
store.commit('task/setTaskDetailShow', sessionTaskDetailShow);
}
// if (sessionTask && !taskDetail.value.id) {
// const info = JSON.parse(sessionTask);
// console.log(info);

1
src/views/user/SignIn.vue

@ -208,6 +208,7 @@ function handleSingIn() {
};
const resData = await signIn(params);
store.commit('user/setUser', resData);
store.commit('user/setToken', resData.token);
// ElMessage.success(' ');
console.log('登录成功, 欢迎回来');
setTimeout(() => {

Loading…
Cancel
Save