Min5203 4 years ago
parent
commit
984b0bc112
  1. 5
      apis/axios.js
  2. 33
      apis/finance.js
  3. 7
      apis/index.js
  4. 50
      app.vue
  5. 153
      components/FinanceExamine.vue
  6. 166
      components/FinanceManage.vue
  7. 21
      composables/state.ts
  8. 1
      nuxt.config.ts
  9. 30
      package-lock.json
  10. 3
      package.json
  11. 3
      pages/Initiate-application.vue
  12. 11
      pages/financial-approval.vue
  13. 72
      pages/index.vue
  14. 8
      plugins/vant.js
  15. 15
      rest/http-client.env.json
  16. 109
      rest/财务条.http
  17. 10
      store/index.js
  18. 61
      store/user.js

5
apis/axios.js

@ -1,6 +1,7 @@
import Axios from 'axios';
import { Toast } from 'vant';
import store from 'store';
// import store from 'store';
import { createApp } from 'vue';
const app = createApp();
app.use(Toast);
@ -15,7 +16,7 @@ const instance = Axios.create({
// request
instance.interceptors.request.use(
config => {
const token = store.getters['user/token'] || sessionStorage.getItem('token');
const token = sessionStorage.getItem('token') || '';
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}

33
apis/finance.js

@ -1,14 +1,37 @@
// noinspection SpellCheckingInspection
import http from 'apis/axios';
const apiUrl = import.meta.env.VITE_API_URL;
console.log('apiUrl: ', apiUrl);
const ptccsens = `${apiUrl}/ptccsens/v1.0`;
const finance = `${ptccsens}/finance`;
const projectFinance = `${ptccsens}/projectFinance`;
// 发起申请
export const apply = params => http.post(`${finance}/apply`, params);
// 审批
export const audit = params => http.post(`${finance}/audit`, params);
// 查询申请详情
export const getApplyDetail = params => http.post(`${finance}/getApplyDetail`, params);
// 通过任务id查看任务关联的财务信息
export const getByTask = params => http.post(`${finance}/getByTask`, params);
// 查询费用申请类型
export const queryType = params => http.post(`${finance}/queryType`, params);
// 追加预算
export const addBudget = params => http.post(`${projectFinance}/addBudget`, params);
// 查看项目下的财务信息
export const queryFinanceOfProject = params => http.post(`${projectFinance}/queryFinanceOfProject`, params);
// 查看项目下的所有任务对应的财务信息
export const financeInfo = params => http.post(`${finance}/getByTask`, params);
export const queryProjectFinance = params => http.post(`${projectFinance}/queryProjectFinance`, params);
// 修改任务或项目的预算和奖金信息
// export const edit = params => http.post(`${finance}/info`, params);
export const updateFinance = params => http.post(`${projectFinance}/updateFinance`, params);
// 查看自己需要审批的申请
export const queryNeedCheckByMe = params => http.post(`${projectFinance}/queryNeedCheckByMe`, params);

7
apis/index.js

@ -1,9 +1,8 @@
// noinspection SpellCheckingInspection
import http from 'apis/axios';
const apiUrl = 'https://test.tall.wiki';
const users = `${apiUrl}/gateway/ptostall/users`;
const apiUrl = import.meta.env.VITE_API_URL;
const ptccsens = `${apiUrl}/gateway/tall3/v3.0`;
const users = `${ptccsens}/users`;
// 根据userId 获取token
export const getToken = userId => http.get(`${users}/userId`, { params: { userId } });

50
app.vue

@ -1,3 +1,53 @@
<template>
<NuxtPage />
</template>
<script setup>
import { reactive } from 'vue';
import { useRouter } from 'vue-router';
import { getToken } from 'apis/index'
const router = useRouter();
const user = useUser()
const userId = useUserId()
const projectId = useProjectId()
const taskId = useTaskId()
//
const routeValue = router.currentRoute.value;
console.log('routeValue: ', routeValue);
userId.value = routeValue && routeValue.query && routeValue.query.userId ? routeValue.query.userId : '';
projectId.value = routeValue && routeValue.query && routeValue.query.projectId ? routeValue.query.projectId : '';
taskId.value = routeValue && routeValue.query && routeValue.query.id ? routeValue.query.id : '';
// const userString = sessionStorage.getItem('user') || null;
// if (userString) {
// const userInfo = JSON.parse(userString);
// user.value = userInfo;
// } else {
getTokenByUserId(userId.value)
// }
/**
* 根据userId获取token级user信息
* @param {*} param
* @param {string} userId 用户id
*/
async function getTokenByUserId(userId) {
try {
const data = await getToken(userId);
user.value = data || null;
console.log('data: ', data);
if (data) {
sessionStorage.setItem('token', data.token);
sessionStorage.setItem('user', JSON.stringify(data));
} else {
sessionStorage.removeItem('token');
sessionStorage.removeItem('user');
}
} catch (error) {
console.error('error: ', error);
}
}
</script>

153
components/FinanceExamine.vue

@ -1,5 +1,5 @@
<template>
<div>
<div v-if="data.info.list && data.info.list.length">
<div class="w-full overflow-x-scroll">
<table class="text-gray-500 mt-4 text-xs">
<tr class="bg-gray-100">
@ -8,92 +8,107 @@
<td width="20%">时间</td>
<td width="10%">操作</td>
</tr>
<tr v-for="item in arrayData" @click="viewDetails">
<tr v-for="item in data.info.list">
<td>{{item.submitName}}</td>
<td>{{item.money}}</td>
<td>{{dayjs(item.submitTime - 0).format('YYYY-MM-DD')}}</td>
<td>
<div v-if="item.applyType === 0" class="flex flex-row justify-around">
<van-button type="success" size="mini" class="rounded">通过</van-button>
<van-button type="danger" size="mini" class="rounded">驳回</van-button>
<div v-if="!item.applyType" class="flex flex-row justify-between">
<!-- <van-popover v-model:show="showPopover">
<div>侧司法所</div>
<template #reference>
<van-button type="success" size="mini" class="rounded" @click="showRemark(item.financeCheckId, 1)">通过</van-button>
<van-button type="danger" size="mini" class="rounded" @click="showRemark(item.financeCheckId, 1)">驳回</van-button>
</template>
</van-popover> -->
<van-button type="success" size="mini" class="rounded" @click="showRemark(item.financeCheckId, 1)">通过</van-button>
<van-button type="danger" size="mini" class="rounded" @click="showRemark(item.financeCheckId, 1)">驳回</van-button>
</div>
<div class="text-center" v-else :class="item.applyType === 1 ? 'text-gray-500' : 'text-red-500'">{{ item.applyType === 1 ? '已完成' : '已驳回' }}</div>
<div class="text-center" v-else :class="item.applyType === 1 ? 'text-blue-500' : 'text-red-500'">{{ item.applyType === 1 ? '已完成' : '已驳回' }}</div>
</td>
</tr>
</table>
</div>
<div class="w-1/2 mt-4 ml-48">
<van-pagination v-model="currentPage" :page-count="12" mode="simple" />
<van-pagination v-model="data.pageNum" :items-per-page="data.pageSize" :page-count="data.pages" mode="simple" />
</div>
</div>
<van-empty v-else description="暂无数据" />
</template>
<script setup>
import dayjs from "dayjs";
import {ref} from'vue';
const props = defineProps({ routeUrl : { type: Object, default: () => {} } });
const arrayData = ref([
{
applyId: '001',
submitName:'代用名',
money:0,
submitTime: '1643018415000',
applyType: 0,
},
{
applyId: '001',
submitName:'代用名',
money:0,
submitTime: '1643018415000',
applyType: 1,
},
{
applyId: '001',
submitName:'代用名',
money:0,
submitTime: '1643018415000',
applyType: 0,
},
{
applyId: '001',
submitName:'代用名',
money:0,
submitTime: '1643018415000',
applyType: 0,
},
{
applyId: '001',
submitName:'代用名',
money:1000,
submitTime: '1643018415000',
applyType: 2,
},
{
applyId: '001',
submitName:'代用名',
money:0,
submitTime: '1643018415000',
applyType: 0,
},
{
applyId: '001',
submitName:'代用名',
money:0,
submitTime: '1643018415000',
applyType: 0,
},
{
applyId: '001',
submitName:'代用名',
money:0,
submitTime: '1643018415000',
applyType: 0,
import {ref, reactive, onMounted, nextTick} from'vue';
import { queryNeedCheckByMe, audit } from 'apis/finance';
import { Toast } from 'vant';
const data = reactive({
info: {},
pageNum: 1,
pageSize: 10,
pages: 0,
showPopover: false,
})
const taskId = useTaskId()
/**
* 查看项目下的所有任务对应的财务信息
* @param { Number } pageNum
* @param { Number } pageSize
* @param { String } taskDetailId 任务详情id
*/
async function handleFinanceOfProject(){
try {
const params = {
param:{
pageNum: data.pageNum,
pageSize: data.pageSize,
taskDetailId: taskId.value
}
}
const res = await queryNeedCheckByMe(params)
data.info = res
data.pageNum = res && res.pageNum ? +res.pageNum : 1
data.pageSize = res && res.pageSize ? +res.pageSize : 10
data.pages = res && res.pages ? +res.pages : 0
} catch (error) {
console.error('error: ', error);
}
}
]);
const currentPage = ref(1);
function viewDetails(){
console.log(props.routeUrl)
onMounted(() => {
nextTick(() => {
handleFinanceOfProject()
})
})
//
function showRemark(financeCheckId, checkStatus){
data.showPopover = true
}
/**
* 审批
* @param { Number } checkStatus 审核状态 1已通过 2驳回
* @param { String } financeCheckId 审核id
* @param { String } remark 备注
*/
async function handleAudit(financeCheckId, checkStatus){
try {
const params = {
param:{
financeCheckId,
checkStatus,
remark: ''
}
}
// const res = await audit(params)
Toast('审批成功');
handleFinanceOfProject()
} catch (error) {
console.error('error: ', error);
}
}
</script>

166
components/FinanceManage.vue

@ -1,106 +1,126 @@
<template>
<div>
<table class="w-full text-gray-500 mt-4 text-xs">
<div v-if="data.info.taskFinanceList && data.info.taskFinanceList.list && data.info.taskFinanceList.list.length">
<table class="w-full text-gray-500 mt-4 text-ms">
<tr class="bg-gray-100">
<td class="40">任务名称</td>
<td class="25">预算()</td>
<td class="25">奖金()</td>
<td class="name">任务名称</td>
<td class="">预算()</td>
<td class="">奖金()</td>
</tr>
<tr v-for="item in arrayData" @click="dataDetails">
<tr v-for="item in data.info.taskFinanceList.list">
<td>{{item.name}}</td>
<td>
<div v-if="!item.showBudgetEdit" @click="item.showBudgetEdit = true">{{item.budget}}</div>
<van-field v-else v-model="item.budget" type="number" class="input-box" @blur="item.showBudgetEdit = false" />
<van-field v-else v-model="item.budget" type="number" class="input-box" @change="handleUpdateFinance(item)" @blur="item.showBudgetEdit = false" />
</td>
<td>
<div v-if="!item.showBonusEdit" @click="item.showBonusEdit = true">{{item.bonus}}</div>
<van-field v-else v-model="item.bonus" type="number" class="input-box" @blur="item.showBonusEdit = false" />
<van-field v-else v-model="item.bonus" type="number" class="input-box" @change="handleUpdateFinance(item)" @blur="item.showBonusEdit = false" />
</td>
</tr>
<tr>
<td>合计</td>
<td>{{sumBudget}}</td>
<td>{{sumBonus}}</td>
<td>{{data.info.budget || 0}}</td>
<td>{{data.info.bonus || 0}}</td>
</tr>
</table>
<div class="w-1/2 mt-4 ml-48">
<van-pagination v-model="currentPage" :page-count="12" mode="simple" />
<van-pagination v-model="data.pageNum" :items-per-page="data.pageSize" :page-count="data.pages" mode="simple" />
</div>
</div>
<van-empty v-else description="暂无数据" />
</div>
</template>
<script setup>
import {ref} from'vue'
const arrayData = ref([
{
name:'财务条插件界面设计',
budget:1000,
bonus:0,
showBudgetEdit: false,
showBonusEdit: false,
},
{
name:'财务条插件界面设计',
budget:0,
bonus:0,
showBudgetEdit: false,
showBonusEdit: false,
},
{
name:'财务条插件界面设计',
budget:0,
bonus:0,
showBudgetEdit: false,
showBonusEdit: false,
},
{
name:'财务条插件界面设计',
budget:0,
bonus:200,
showBudgetEdit: false,
showBonusEdit: false,
},
{
name:'财务条插件界面设计',
budget:1000,
bonus:0,
showBudgetEdit: false,
showBonusEdit: false,
},
{
name:'财务条插件界面设计',
budget:0,
bonus:0,
showBudgetEdit: false,
showBonusEdit: false,
},
{
name:'财务条插件界面设计',
budget:0,
bonus:0,
showBudgetEdit: false,
showBonusEdit: false,
},
{
name:'财务条插件界面设计',
budget:0,
bonus:200,
showBudgetEdit: false,
showBonusEdit: false,
import { queryProjectFinance, updateFinance } from 'apis/finance'
import {ref, reactive, onMounted, nextTick} from'vue'
const data = reactive({
info: {},
pageNum: 1,
pageSize: 10,
pages: 0
})
const projectId = useProjectId()
/**
* 查看项目下的所有任务对应的财务信息
* @param {
*
Number } pageNum
* @param { Number } pageSize
* @param { String } projectId
* @param { String } name
*/
async function handleProjectFinance(){
try {
const params = {
param:{
pageNum: data.pageNum,
pageSize: data.pageSize,
projectId: projectId.value
}
}
const res = await queryProjectFinance(params)
data.info = res
data.pageNum = res.taskFinanceList && res.taskFinanceList.pageNum ? +res.taskFinanceList.pageNum : 1
data.pageSize = res.taskFinanceList && res.taskFinanceList.pageSize ? +res.taskFinanceList.pageSize : 10
data.pages = res.taskFinanceList && res.taskFinanceList.pages ? +res.taskFinanceList.pages : 0
} catch (error) {
console.error('error: ', error);
}
}
]);
const sumBudget = arrayData.value.reduce((sum, e) => sum + e.budget, 0);
const sumBonus = arrayData.value.reduce((sum, e) => sum + e.bonus, 0);
const currentPage = ref(1);
/**
* 修改任务或项目的预算和奖金信息
* @param { Number } bonus 奖金
* @param { Number } budget 预算
* @param { String } taskDetailId 任务详情id
* @param { String } taskFinanceId 任务财务信息id
*/
async function handleUpdateFinance(item){
console.log('item: ', item);
try {
const params = {
param:{
bonus: item.bonus,
budget: item.budget,
taskDetailId: item.taskDetailId,
taskFinanceId: item.taskFinanceId,
}
}
const res = await updateFinance(params)
handleProjectFinance()
} catch (error) {
console.error('error: ', error);
}
}
onMounted(() => {
nextTick(() => {
handleProjectFinance()
})
})
</script>
<style scoped lang="less">
table {
td {
border: 0.5px solid #ccc;
padding: 0.7rem;
padding: 0.85rem;
width: 5.9375rem;
}
.name{
width:50%
}
}
.input-box{
width:45px;
padding: 0!important;
border-bottom: 1px solid #ccc
}

21
composables/state.ts

@ -0,0 +1,21 @@
import { useState } from '#app';
export const useToken = () => {
return useState('token', () => '');
};
export const useUserId = () => {
return useState('userId', () => '');
};
export const useProjectId = () => {
return useState('projectId', () => '');
};
export const useUser = () => {
return useState('user', () => null);
};
export const useTaskId = () => {
return useState('taskId', () => null);
};

1
nuxt.config.ts

@ -11,7 +11,6 @@ export default defineNuxtConfig({
pages: resolve(__dirname, './pages'),
hooks: resolve(__dirname, './hooks'),
apis: resolve(__dirname, './apis'),
store: resolve(__dirname, './store'),
public: resolve(__dirname, './public'),
},
meta: {

30
package-lock.json

@ -1,5 +1,5 @@
{
"name": "finance",
"name": "plugin-finance",
"lockfileVersion": 2,
"requires": true,
"packages": {
@ -8,7 +8,8 @@
"axios": "^0.25.0",
"dayjs": "^1.10.7",
"lodash": "^4.17.21",
"vant": "^3.4.2"
"vant": "^3.4.2",
"vuex": "^4.0.2"
},
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^5.10.0",
@ -1885,8 +1886,7 @@
"node_modules/@vue/devtools-api": {
"version": "6.0.0-beta.21.1",
"resolved": "https://registry.npmmirror.com/@vue/devtools-api/download/@vue/devtools-api-6.0.0-beta.21.1.tgz",
"integrity": "sha512-FqC4s3pm35qGVeXRGOjTsRzlkJjrBLriDS9YXbflHLsfA9FrcKzIyWnLXoNm+/7930E8rRakXuAc2QkC50swAw==",
"dev": true
"integrity": "sha512-FqC4s3pm35qGVeXRGOjTsRzlkJjrBLriDS9YXbflHLsfA9FrcKzIyWnLXoNm+/7930E8rRakXuAc2QkC50swAw=="
},
"node_modules/@vue/reactivity": {
"version": "3.2.27",
@ -10241,6 +10241,17 @@
"integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=",
"dev": true
},
"node_modules/vuex": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/vuex/-/vuex-4.0.2.tgz",
"integrity": "sha512-M6r8uxELjZIK8kTKDGgZTYX/ahzblnzC4isU1tpmEuOIIKmV+TRdc+H4s8ds2NuZ7wpUTdGRzJRtoj+lI+pc0Q==",
"dependencies": {
"@vue/devtools-api": "^6.0.0-beta.11"
},
"peerDependencies": {
"vue": "^3.0.2"
}
},
"node_modules/watchpack": {
"version": "2.3.1",
"resolved": "https://registry.npmmirror.com/watchpack/download/watchpack-2.3.1.tgz",
@ -12256,8 +12267,7 @@
"@vue/devtools-api": {
"version": "6.0.0-beta.21.1",
"resolved": "https://registry.npmmirror.com/@vue/devtools-api/download/@vue/devtools-api-6.0.0-beta.21.1.tgz",
"integrity": "sha512-FqC4s3pm35qGVeXRGOjTsRzlkJjrBLriDS9YXbflHLsfA9FrcKzIyWnLXoNm+/7930E8rRakXuAc2QkC50swAw==",
"dev": true
"integrity": "sha512-FqC4s3pm35qGVeXRGOjTsRzlkJjrBLriDS9YXbflHLsfA9FrcKzIyWnLXoNm+/7930E8rRakXuAc2QkC50swAw=="
},
"@vue/reactivity": {
"version": "3.2.27",
@ -18686,6 +18696,14 @@
}
}
},
"vuex": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/vuex/-/vuex-4.0.2.tgz",
"integrity": "sha512-M6r8uxELjZIK8kTKDGgZTYX/ahzblnzC4isU1tpmEuOIIKmV+TRdc+H4s8ds2NuZ7wpUTdGRzJRtoj+lI+pc0Q==",
"requires": {
"@vue/devtools-api": "^6.0.0-beta.11"
}
},
"watchpack": {
"version": "2.3.1",
"resolved": "https://registry.npmmirror.com/watchpack/download/watchpack-2.3.1.tgz",

3
package.json

@ -22,6 +22,7 @@
"axios": "^0.25.0",
"dayjs": "^1.10.7",
"lodash": "^4.17.21",
"vant": "^3.4.2"
"vant": "^3.4.2",
"vuex": "^4.0.2"
}
}

3
pages/Initiate-application.vue

@ -239,12 +239,9 @@
</div>
</div>
<!-- 底部立即提交按钮 -->
<NuxtLink to="/application-details">
<div class="mx-6 mt-10">
<van-button type="primary" size="small" block>立即提交</van-button>
</div>
</NuxtLink>
</div>
</template>
<script setup>

11
pages/financial-approval.vue

@ -3,7 +3,7 @@
<!-- 财务审批页面 -->
<div class="bg-white p-4 flex text-gray-500 flex-col d_jump">
<div>
<span class="font-semibold">财务审批</span> <span class="ml-2 text-xs">对员工提交的申请进行审批</span>
<span class="font-semibold" id="finance-audit">财务审批</span> <span class="ml-2 text-xs">对员工提交的申请进行审批</span>
</div>
<Search />
<FinanceExamine />
@ -11,13 +11,13 @@
<!-- 财务统计页面 -->
<div class="bg-white p-4 mt-5 flex text-gray-500 flex-col d_jump">
<div>
<span class="font-semibold">财务统计</span> <span class="ml-2 text-xs">财务明细统计查看</span>
<span class="font-semibold" id="finance-statistical">财务统计</span> <span class="ml-2 text-xs">财务明细统计查看</span>
</div>
<img src="public/statistics.png" class="w-full">
</div>
<ul class="menu">
<li @click="jump(0)">财务审批</li>
<li @click="jump(1)">财务统计</li>
<a href="#finance-audit">财务审批</a>
<a href="#finance-statistical">财务统计</a>
</ul>
</div>
@ -64,7 +64,8 @@ function jump(index) {
bottom: 15px;
z-index: 99
}
.menu li{
.menu a {
display: block;
width: 72px;
color: #fff;
background: rgba(25, 137, 250, 0.6);

72
pages/index.vue

@ -1,11 +1,19 @@
<template>
<div class="mb-60">
<van-tabs v-model:active="active" shrink line-width="60px" color="#59B4FF" title-active-color="#59B4FF">
<van-nav-bar title="资源管理" left-arrow @click-left="onClickLeft" />
<van-tabs
v-model:active="active"
shrink
line-width="60px"
color="#59B4FF"
title-active-color="#59B4FF"
>
<van-tab title="财务管理">
<!-- 财务管理页面 -->
<div class="bg-white p-4 mt-5 flex text-gray-500 flex-col d_jump">
<div>
<span class="font-semibold">财务管理</span> <span class="ml-2">对项目预算奖金进行配置</span>
<span class="font-semibold" id="finance-manage">财务管理</span>
<span class="ml-2">对项目预算奖金进行配置</span>
</div>
<Search />
<FinanceManage />
@ -13,17 +21,19 @@
<!-- 财务审批页面 -->
<div class="bg-white p-4 mt-5 flex text-gray-500 flex-col d_jump">
<div>
<span class="font-semibold">财务审批</span> <span class="ml-2">对员工提交的申请进行审批</span>
<span class="font-semibold" id="finance-audit">财务审批</span>
<span class="ml-2">对员工提交的申请进行审批</span>
</div>
<Search />
<FinanceExamine :routeUrl="'financial-approval-details'" />
<FinanceExamine />
</div>
<!-- 财务统计页面 -->
<div class="bg-white p-4 mt-5 flex text-gray-500 flex-col d_jump">
<div>
<span class="font-semibold">财务统计</span> <span class="ml-2 ">财务明细统计查看</span>
<span class="font-semibold" id="finance-statistical">财务统计</span>
<span class="ml-2">财务明细统计查看</span>
</div>
<img src="public/statistics.png" class="w-full">
<img src="public/statistics.png" class="w-full" />
</div>
</van-tab>
<van-tab title="角色管理">角色管理</van-tab>
@ -31,13 +41,12 @@
<van-tab title="成员管理">成员管理</van-tab>
</van-tabs>
<ul class="menu">
<li @click="jump(0)">财务管理</li>
<li @click="jump(1)">财务审批</li>
<li @click="jump(2)">财务统计</li>
</ul>
<div class="menu">
<a href="#finance-manage">财务管理</a>
<a href="#finance-audit">财务审批</a>
<a href="#finance-statistical">财务统计</a>
</div>
</div>
</template>
<script>
@ -47,40 +56,47 @@ export default {
</script>
<script setup>
import {ref} from 'vue'
import { ref, onMounted, nextTick } from 'vue';
const active = ref(0);
function onClickLeft(){
console.log('返回上一页')
onMounted(async () => {
scrollToElementByHash();
});
// hash
async function scrollToElementByHash() {
await nextTick();
const hash = window.location.hash;
if (!hash) return;
const scrollDom = document.querySelector(hash);
document.body.scrollTop = scrollDom.offsetTop;
document.documentElement.scrollTop = scrollDom.offsetTop;
window.pageYOffset = scrollDom.offsetTop;
}
function jump(index) {
let jump = document.querySelectorAll('.d_jump')
//
let total = jump[index].offsetTop
// Chrome
document.body.scrollTop = total
// Firefox
document.documentElement.scrollTop = total
// Safari
window.pageYOffset = total
function onClickLeft() {
console.log('返回上一页');
}
</script>
<style lang="less">
.van-nav-bar__content {
background-color:#eee
background-color: #eee;
}
.van-icon-arrow-left:before {
color: #000;
}
</style>
<style scoped lang="less">
.menu {
position: fixed;
right: 0;
bottom: 15px;
z-index: 99
z-index: 99;
}
.menu li{
.menu a {
display: block;
width: 72px;
color: #fff;
background: rgba(25, 137, 250, 0.6);

8
plugins/vant.js

@ -20,7 +20,8 @@ import {
Popup,
Cascader,
Circle,
Sticky,
Empty,
Popover,
} from 'vant';
import { defineNuxtPlugin } from '#app';
@ -44,6 +45,7 @@ export default defineNuxtPlugin(nuxtApp => {
.use(Cascader)
.use(Popup)
.use(Circle)
.use(Sticky)
.use(Tabs);
.use(Tabs)
.use(Empty)
.use(Popover);
});

15
rest/http-client.env.json

@ -0,0 +1,15 @@
{
"$shared": {
"version": "v1",
"identifier": "wally",
"credential": "111111"
},
"dev": {
"name": "dev",
"url": "https://test.tall.wiki/gateway"
},
"local": {
"version": "v2",
"url": "https://test.tall.wiki/gateway"
}
}

109
rest/财务条.http

@ -0,0 +1,109 @@
@localhost = http://localhost:7320/v1.0
@localhost_tall = http://localhost:7130/v3.0
@test_tall = http://192.168.0.99:7130/v3.0
@test = https://test.tall.wiki/ptccsens/v1.0
@www_tall = http://www.tall.wiki:7130/v3.0
@www = http://www.tall.wiki/ptccsens/v1.0
@type = content-type: application/json;charset=utf-8
### 登录
# song 1218763410024566784
# @name login
POST {{localhost_tall}}/users/signin
{{type}}
{
"client": 1,
"type": 3,
"data": {
"identifier": "whj",
"credential": "123456"
}
}
### debug
GET {{test}}/debug
{{type}}
Authorization: Bearer {{login.response.body.$.data.token}}
###查询费用申请类型
POST {{localhost}}/finance/queryType
{{type}}
Authorization: Bearer {{login.response.body.$.data.token}}
{
"param":{
"parentId":"4",
"type":2
}
}
###发起申请
POST {{localhost}}/finance/apply
{{type}}
Authorization: Bearer {{login.response.body.$.data.token}}
{
"param":{
"checkerList": [
123
],
"invoiceList": [
{
"invoiceCode": "014002100112",
"invoiceNumber": "86610940",
"invoiceTime": 1643075118954,
"money": 4190,
"remark": "业务招待支出",
"taxMoney": 126,
"url": "https://alifei04.cfp.cn/creative/vcg/800/new/VCG211363439424.jpg"
}
],
"projectId": 2,
"taskDetailId": 3,
"remark": "",
"department": "视觉传达事业部",
"submitName": "黛西",
"money": 4190,
"typeId": 1,
"categoryId": 4,
"rowId": 7
}
}
###查询申请详情
POST {{localhost}}/finance/getApplyDetail
{{type}}
Authorization: Bearer {{login.response.body.$.data.token}}
{
"param":{
"applyId":"1485797754654695424"
}
}
###审批
POST {{localhost}}/finance/audit
{{type}}
Authorization: Bearer {{login.response.body.$.data.token}}
{
"param":{
"checkStatus":"2",
"financeCheckId":"1485797754923130880",
"remark":"测试"
}
}
###通过任务id查看任务关联的财务信息
POST {{localhost}}/finance/getByTask
{{type}}
Authorization: Bearer {{login.response.body.$.data.token}}
{
"param":{
"taskDetailId":"3"
}
}

10
store/index.js

@ -1,10 +0,0 @@
import { createStore } from 'vuex';
import user from './user';
export default createStore({
modules: { user },
state: {},
getters: {},
mutations: {},
actions: {},
});

61
store/user.js

@ -1,61 +0,0 @@
import { getToken } from 'apis/index';
export default {
namespaced: true,
state: { user: null },
getters: {
token({ user }) {
if (!user) return null;
return user.token;
},
userId({ user }) {
if (!user) return null;
return user.id;
},
account({ user }) {
if (!user) return null;
return user.account;
},
isAdmin({ user }) {
if (!user) return false;
return user.account === 'iacdadmin';
},
},
mutations: {
/**
* 设置state.user
* @param {*} state
* @param {object|null} user 用户信息
*/
setUser(state, user) {
state.user = user;
if (user) {
sessionStorage.setItem('token', user.token);
sessionStorage.setItem('user', JSON.stringify(user));
} else {
sessionStorage.removeItem('token');
sessionStorage.removeItem('user');
}
},
},
actions: {
/**
* 根据userId获取token级user信息
* @param {*} param0
* @param {string} userId 用户id
*/
async getTokenByUserId({ commit }, userId) {
try {
const data = await getToken(userId);
commit('setUser', data || null);
return data;
} catch (error) {
throw new Error(error);
}
},
},
};
Loading…
Cancel
Save