Skip to content
GitLab
Explore
Sign in
Register
Commits on Source (2)
拆css
· 89aa4223
johnny du
authored
Aug 26, 2025
89aa4223
delete unpackage/dist
· a677e0e6
johnny du
authored
Aug 26, 2025
a677e0e6
Show whitespace changes
Inline
Side-by-side
.gitignore
0 → 100644
View file @
a677e0e6
frontend/inversment-diary/unpackage/dist/*
frontend/inversment-diary/App.vue
View file @
a677e0e6
...
...
@@ -7,7 +7,7 @@
console
.
log
(
'
App Show
'
)
},
onHide
:
function
()
{
console
.
log
(
'
App Hide
'
)
console
.
log
(
'
App Hide
'
)
;
}
}
</
script
>
...
...
frontend/inversment-diary/pages/index/index.css
0 → 100644
View file @
a677e0e6
.container
{
min-height
:
100vh
;
background
:
#f5f7fa
;
padding-bottom
:
120
rpx
;
}
/* 日期选择器 */
.date-header
{
background
:
white
;
padding
:
20
rpx
30
rpx
;
border-bottom
:
1
rpx
solid
#f0f0f0
;
position
:
sticky
;
top
:
0
;
z-index
:
99
;
display
:
flex
;
justify-content
:
space-between
;
align-items
:
center
;
}
.date-selector
{
display
:
flex
;
align-items
:
center
;
padding
:
15
rpx
0
;
}
.edit-toggle
{
padding
:
15
rpx
25
rpx
;
background
:
#007aff
;
border-radius
:
25
rpx
;
cursor
:
pointer
;
transition
:
background-color
0.2s
;
}
.edit-toggle
:hover
{
background
:
#0056b3
;
}
.edit-toggle-text
{
color
:
white
;
font-size
:
28
rpx
;
font-weight
:
500
;
}
.date-text
{
color
:
#333
;
font-size
:
32
rpx
;
font-weight
:
bold
;
margin-right
:
15
rpx
;
}
.calendar-icon
{
font-size
:
28
rpx
;
color
:
#007aff
;
}
/* 自定义日历 */
.calendar-overlay
{
position
:
fixed
;
top
:
0
;
left
:
0
;
width
:
100%
;
height
:
100%
;
background
:
rgba
(
0
,
0
,
0
,
0.5
);
display
:
flex
;
align-items
:
center
;
justify-content
:
center
;
z-index
:
1000
;
}
.calendar-popup
{
background
:
white
;
width
:
90%
;
max-width
:
600
rpx
;
border-radius
:
20
rpx
;
padding
:
30
rpx
;
box-shadow
:
0
10
rpx
30
rpx
rgba
(
0
,
0
,
0
,
0.3
);
}
.calendar-header
{
display
:
flex
;
justify-content
:
space-between
;
align-items
:
center
;
margin-bottom
:
30
rpx
;
padding-bottom
:
20
rpx
;
border-bottom
:
1
rpx
solid
#f0f0f0
;
}
.calendar-title
{
font-size
:
36
rpx
;
font-weight
:
bold
;
color
:
#333
;
}
.calendar-nav
{
display
:
flex
;
gap
:
30
rpx
;
}
.nav-btn
{
width
:
60
rpx
;
height
:
60
rpx
;
background
:
#f5f5f5
;
border-radius
:
50%
;
display
:
flex
;
align-items
:
center
;
justify-content
:
center
;
font-size
:
24
rpx
;
color
:
#666
;
}
.calendar-weekdays
{
display
:
grid
;
grid-template-columns
:
repeat
(
7
,
1fr
);
gap
:
10
rpx
;
margin-bottom
:
20
rpx
;
}
.weekday
{
text-align
:
center
;
color
:
#999
;
font-size
:
24
rpx
;
padding
:
15
rpx
0
;
}
.calendar-days
{
display
:
flex
;
flex-direction
:
column
;
gap
:
5
rpx
;
}
.calendar-row
{
display
:
grid
;
grid-template-columns
:
repeat
(
7
,
1fr
);
gap
:
5
rpx
;
}
.calendar-day
{
aspect-ratio
:
1
;
display
:
flex
;
align-items
:
center
;
justify-content
:
center
;
border-radius
:
8
rpx
;
cursor
:
pointer
;
transition
:
all
0.2s
;
}
.calendar-day.other-month
{
opacity
:
0.3
;
}
.calendar-day.selected
{
background
:
#007aff
;
color
:
white
;
}
.calendar-day.today
{
background
:
#e8f4ff
;
color
:
#007aff
;
font-weight
:
bold
;
}
.calendar-day.selected.today
{
background
:
#007aff
;
color
:
white
;
}
.day-number
{
font-size
:
28
rpx
;
}
/* 可编辑字段样式 */
.editable-field
{
display
:
flex
;
align-items
:
center
;
cursor
:
pointer
;
padding
:
4
rpx
8
rpx
;
border-radius
:
6
rpx
;
transition
:
background-color
0.2s
;
position
:
relative
;
}
.editable-field
:hover
{
background-color
:
rgba
(
0
,
122
,
255
,
0.1
);
}
.edit-icon
{
font-size
:
20
rpx
;
margin-left
:
8
rpx
;
opacity
:
0.6
;
transition
:
opacity
0.2s
;
}
.editable-field
:hover
.edit-icon
{
opacity
:
1
;
}
/* 账户概览 */
.account-overview
{
background
:
white
;
margin
:
20
rpx
;
border-radius
:
16
rpx
;
padding
:
30
rpx
;
box-shadow
:
0
2
rpx
10
rpx
rgba
(
0
,
0
,
0
,
0.1
);
}
.balance-section
{
display
:
flex
;
justify-content
:
space-between
;
align-items
:
center
;
margin-bottom
:
30
rpx
;
}
.balance-left
{
flex
:
1
;
}
.balance-label
{
display
:
block
;
color
:
#666
;
font-size
:
28
rpx
;
margin-bottom
:
10
rpx
;
}
.balance-amount
{
display
:
block
;
color
:
#333
;
font-size
:
48
rpx
;
font-weight
:
bold
;
}
.balance-input
{
max-width
:
300
rpx
;
font-size
:
48
rpx
;
font-weight
:
bold
;
color
:
#333
;
border
:
2
rpx
solid
#007aff
;
border-radius
:
12
rpx
;
padding
:
15
rpx
20
rpx
;
background
:
#f8f9fa
;
box-shadow
:
0
2
rpx
8
rpx
rgba
(
0
,
122
,
255
,
0.1
);
}
.profit-input
{
max-width
:
200
rpx
;
font-size
:
28
rpx
;
font-weight
:
bold
;
color
:
#333
;
border
:
2
rpx
solid
#007aff
;
border-radius
:
10
rpx
;
padding
:
12
rpx
16
rpx
;
background
:
#f8f9fa
;
text-align
:
center
;
box-shadow
:
0
2
rpx
8
rpx
rgba
(
0
,
122
,
255
,
0.1
);
}
.profit-input-wrapper
{
margin-top
:
8
rpx
;
display
:
flex
;
justify-content
:
center
;
}
.balance-right
{
text-align
:
center
;
}
.asset-label
{
display
:
block
;
color
:
#666
;
font-size
:
24
rpx
;
margin-bottom
:
10
rpx
;
}
.progress-circle
{
width
:
80
rpx
;
height
:
80
rpx
;
border-radius
:
50%
;
display
:
flex
;
align-items
:
center
;
justify-content
:
center
;
position
:
relative
;
}
/* 不同仓位等级的颜色 - 这些样式已由动态样式替代,可以保留作为备用 */
.progress-circle.position-safe
{
/* background: conic-gradient(#00d4aa 0deg 306deg, #e6f7ff 306deg 360deg); */
}
.progress-circle.position-medium
{
/* background: conic-gradient(#ffa502 0deg 306deg, #e6f7ff 306deg 360deg); */
}
.progress-circle.position-high
{
/* background: conic-gradient(#ff4757 0deg 306deg, #e6f7ff 306deg 360deg); */
}
.progress-circle
::after
{
content
:
''
;
width
:
60
rpx
;
height
:
60
rpx
;
background
:
white
;
border-radius
:
50%
;
position
:
absolute
;
}
.progress-text
{
font-size
:
24
rpx
;
font-weight
:
bold
;
z-index
:
1
;
}
/* 不同仓位等级的文字颜色 */
.position-safe
.progress-text
{
color
:
#00d4aa
;
}
.position-medium
.progress-text
{
color
:
#ffa502
;
}
.position-high
.progress-text
{
color
:
#ff4757
;
}
.profit-section
{
display
:
flex
;
justify-content
:
space-between
;
}
.profit-item
{
text-align
:
center
;
}
.profit-label
{
display
:
block
;
color
:
#666
;
font-size
:
24
rpx
;
margin-bottom
:
8
rpx
;
}
.profit-value
{
display
:
block
;
font-size
:
28
rpx
;
font-weight
:
bold
;
}
.profit-value.positive
{
color
:
#ff4757
;
}
.profit-value.negative
{
color
:
#00d4aa
;
}
/* 持仓 */
.holdings-section
{
margin
:
20
rpx
;
}
.section-header
{
display
:
flex
;
justify-content
:
space-between
;
align-items
:
center
;
margin-bottom
:
20
rpx
;
}
.section-title
{
display
:
block
;
color
:
#333
;
font-size
:
32
rpx
;
font-weight
:
bold
;
}
.add-holding-btn
{
display
:
flex
;
align-items
:
center
;
gap
:
8
rpx
;
padding
:
8
rpx
15
rpx
;
background
:
#007aff
;
border-radius
:
20
rpx
;
color
:
white
;
font-size
:
24
rpx
;
font-weight
:
500
;
cursor
:
pointer
;
transition
:
background-color
0.2s
;
}
.add-holding-btn
:hover
{
background
:
#0056b3
;
}
.add-icon
{
font-size
:
28
rpx
;
}
.add-text
{
font-size
:
28
rpx
;
}
.holdings-grid
{
display
:
grid
;
grid-template-columns
:
repeat
(
2
,
1fr
);
gap
:
20
rpx
;
}
.holding-card
{
background
:
white
;
border-radius
:
16
rpx
;
padding
:
25
rpx
;
box-shadow
:
0
2
rpx
10
rpx
rgba
(
0
,
0
,
0
,
0.1
);
position
:
relative
;
}
.card-deleted
{
opacity
:
0.5
;
pointer-events
:
none
;
background
:
#f5f5f5
;
border
:
2
rpx
dashed
#ccc
;
}
.card-deleted
.stock-name
,
.card-deleted
.amount-value
,
.card-deleted
.price-value
{
color
:
#999
;
text-decoration
:
line-through
;
}
.card-deleted
.delete-btn
{
background
:
#00d4aa
;
pointer-events
:
auto
;
}
.delete-btn
{
position
:
absolute
;
top
:
15
rpx
;
right
:
15
rpx
;
background
:
#ff4757
;
border-radius
:
50%
;
width
:
50
rpx
;
height
:
50
rpx
;
display
:
flex
;
align-items
:
center
;
justify-content
:
center
;
font-size
:
30
rpx
;
color
:
white
;
z-index
:
1
;
cursor
:
pointer
;
transition
:
background-color
0.2s
;
}
.delete-btn
:hover
{
background
:
#e03e4e
;
}
.delete-icon
{
font-size
:
30
rpx
;
}
.holding-header
{
display
:
flex
;
justify-content
:
space-between
;
align-items
:
flex-start
;
margin-bottom
:
20
rpx
;
}
.stock-name-wrapper
{
display
:
flex
;
align-items
:
center
;
}
.stock-name
{
color
:
#333
;
font-size
:
30
rpx
;
font-weight
:
bold
;
margin-right
:
8
rpx
;
}
.lock-icon
{
font-size
:
20
rpx
;
color
:
#999
;
}
.stock-name-input
{
max-width
:
200
rpx
;
font-size
:
30
rpx
;
font-weight
:
bold
;
color
:
#333
;
border
:
2
rpx
solid
#007aff
;
border-radius
:
10
rpx
;
padding
:
12
rpx
16
rpx
;
background
:
#f8f9fa
;
text-align
:
center
;
box-shadow
:
0
2
rpx
8
rpx
rgba
(
0
,
122
,
255
,
0.1
);
}
.position-percentage
{
font-size
:
22
rpx
;
color
:
#007aff
;
background
:
#e8f4ff
;
padding
:
4
rpx
10
rpx
;
border-radius
:
6
rpx
;
}
.stock-change
{
font-size
:
22
rpx
;
padding
:
4
rpx
10
rpx
;
border-radius
:
6
rpx
;
}
.stock-change.positive
{
color
:
#ff4757
;
background
:
#fff1f0
;
}
.stock-change.negative
{
color
:
#00d4aa
;
background
:
#f0fff4
;
}
.change-input
{
max-width
:
100
rpx
;
font-size
:
24
rpx
;
color
:
#333
;
padding
:
12
rpx
16
rpx
;
border-radius
:
8
rpx
;
border
:
2
rpx
solid
#007aff
;
background
:
#f8f9fa
;
text-align
:
right
;
font-weight
:
500
;
box-shadow
:
0
1
rpx
6
rpx
rgba
(
0
,
122
,
255
,
0.1
);
transition
:
all
0.2s
;
}
.stock-price
{
display
:
flex
;
justify-content
:
space-between
;
align-items
:
center
;
margin-bottom
:
25
rpx
;
}
.price-value
{
font-size
:
40
rpx
;
font-weight
:
bold
;
color
:
#333
;
}
.price-input
{
max-width
:
100
rpx
;
font-size
:
40
rpx
;
font-weight
:
bold
;
color
:
#333
;
border
:
2
rpx
solid
#007aff
;
border-radius
:
10
rpx
;
padding
:
12
rpx
16
rpx
;
background
:
#f8f9fa
;
text-align
:
right
;
box-shadow
:
0
2
rpx
8
rpx
rgba
(
0
,
122
,
255
,
0.1
);
}
.holding-amounts
{
margin-bottom
:
25
rpx
;
}
.amount-labels
{
display
:
flex
;
justify-content
:
space-between
;
margin-bottom
:
8
rpx
;
}
.amount-label
{
color
:
#666
;
font-size
:
22
rpx
;
}
.amount-row
{
display
:
flex
;
justify-content
:
space-between
;
margin-bottom
:
8
rpx
;
}
.amount-field
{
flex
:
1
;
margin-right
:
10
rpx
;
display
:
flex
;
justify-content
:
center
;
align-items
:
center
;
}
.amount-field
:last-child
{
margin-right
:
0
;
}
.amount-value
{
color
:
#333
;
font-weight
:
bold
;
font-size
:
24
rpx
;
cursor
:
pointer
;
padding
:
2
rpx
4
rpx
;
border-radius
:
4
rpx
;
transition
:
background-color
0.2s
;
}
.amount-value
:hover
{
background-color
:
#f0f0f0
;
}
.amount-value.profit
{
color
:
#ff4757
;
}
.amount-value.loss
{
color
:
#00d4aa
;
}
.amount-input
{
max-width
:
150
rpx
;
font-size
:
24
rpx
;
color
:
#333
;
padding
:
12
rpx
16
rpx
;
border-radius
:
8
rpx
;
border
:
2
rpx
solid
#007aff
;
background
:
#f8f9fa
;
text-align
:
right
;
font-weight
:
500
;
box-shadow
:
0
1
rpx
6
rpx
rgba
(
0
,
122
,
255
,
0.1
);
transition
:
all
0.2s
;
}
/* 今日操作 */
.operations-section
{
margin
:
20
rpx
;
}
.operations-list
{
background
:
white
;
border-radius
:
16
rpx
;
overflow
:
hidden
;
box-shadow
:
0
2
rpx
10
rpx
rgba
(
0
,
0
,
0
,
0.1
);
}
.operation-group
{
border-bottom
:
1
rpx
solid
#f5f5f5
;
padding
:
30
rpx
;
}
.operation-group
:last-child
{
border-bottom
:
none
;
}
.operation-stock-header
{
display
:
flex
;
align-items
:
center
;
justify-content
:
space-between
;
margin-bottom
:
20
rpx
;
gap
:
15
rpx
;
}
.operation-stock
{
color
:
#333
;
font-size
:
28
rpx
;
font-weight
:
bold
;
flex-shrink
:
0
;
}
.current-price
{
font-size
:
26
rpx
;
font-weight
:
bold
;
flex-shrink
:
0
;
}
.current-price.positive
{
color
:
#ff4757
;
}
.current-price.negative
{
color
:
#00d4aa
;
}
.price-change
{
font-size
:
22
rpx
;
padding
:
2
rpx
8
rpx
;
border-radius
:
4
rpx
;
font-weight
:
500
;
flex-shrink
:
0
;
}
.price-change.positive
{
color
:
#ff4757
;
background
:
#fff1f0
;
}
.price-change.negative
{
color
:
#00d4aa
;
background
:
#f0fff4
;
}
.holder-count
{
font-size
:
20
rpx
;
color
:
#007aff
;
background
:
#e8f4ff
;
padding
:
4
rpx
8
rpx
;
border-radius
:
6
rpx
;
font-weight
:
500
;
flex-shrink
:
0
;
}
.operations-list-continuous
{
margin-bottom
:
20
rpx
;
}
.operations-list-continuous
.operation-item
{
margin-bottom
:
10
rpx
;
padding
:
15
rpx
;
background
:
#f8f9fa
;
border-radius
:
8
rpx
;
}
.operations-list-continuous
.operation-item
:last-child
{
margin-bottom
:
0
;
}
.operation-notes
{
margin-top
:
15
rpx
;
}
.reasons-section
,
.analyses-section
{
margin-bottom
:
20
rpx
;
}
.reasons-section
:last-child
,
.analyses-section
:last-child
{
margin-bottom
:
0
;
}
.section-subtitle
{
display
:
block
;
font-size
:
26
rpx
;
font-weight
:
bold
;
color
:
#333
;
margin-bottom
:
15
rpx
;
}
.reason-item
,
.analysis-item
{
background
:
#fffbeb
;
padding
:
20
rpx
;
border-radius
:
8
rpx
;
margin-bottom
:
10
rpx
;
border-left
:
4
rpx
solid
#d97706
;
}
.analysis-item
{
background
:
#f0f9ff
;
border-left
:
4
rpx
solid
#0369a1
;
}
.reason-item
:last-child
,
.analysis-item
:last-child
{
margin-bottom
:
0
;
}
.reason-content
,
.analysis-content
{
display
:
block
;
font-size
:
24
rpx
;
line-height
:
1.6
;
margin-bottom
:
8
rpx
;
}
.reason-content
{
color
:
#d97706
;
}
.analysis-content
{
color
:
#0369a1
;
}
.reason-date
,
.analysis-date
{
display
:
block
;
font-size
:
20
rpx
;
color
:
#999
;
text-align
:
right
;
}
.operation-header
{
display
:
flex
;
justify-content
:
space-between
;
align-items
:
center
;
margin-bottom
:
10
rpx
;
}
.operation-type
{
display
:
flex
;
align-items
:
center
;
padding
:
8
rpx
16
rpx
;
border-radius
:
8
rpx
;
gap
:
8
rpx
;
}
.operation-type.buy
{
background
:
#fff1f0
;
color
:
#ff4757
;
}
.operation-type.sell
{
background
:
#f0fff4
;
color
:
#00d4aa
;
}
.type-icon
{
font-size
:
20
rpx
;
}
.type-text
{
font-size
:
24
rpx
;
}
.operation-details
{
color
:
#666
;
font-size
:
24
rpx
;
}
/* 悬浮按钮 */
.floating-button
{
position
:
fixed
;
right
:
30
rpx
;
bottom
:
160
rpx
;
width
:
100
rpx
;
height
:
100
rpx
;
background
:
#007aff
;
border-radius
:
50%
;
display
:
flex
;
align-items
:
center
;
justify-content
:
center
;
box-shadow
:
0
4
rpx
12
rpx
rgba
(
0
,
122
,
255
,
0.4
);
z-index
:
100
;
}
.float-icon
{
color
:
white
;
font-size
:
48
rpx
;
font-weight
:
300
;
}
/* 底部按钮 */
.bottom-button
{
position
:
fixed
;
bottom
:
30
rpx
;
left
:
30
rpx
;
right
:
30
rpx
;
height
:
80
rpx
;
background
:
#007aff
;
border-radius
:
40
rpx
;
display
:
flex
;
align-items
:
center
;
justify-content
:
center
;
box-shadow
:
0
4
rpx
12
rpx
rgba
(
0
,
122
,
255
,
0.4
);
z-index
:
100
;
}
.bottom-text
{
color
:
white
;
font-size
:
32
rpx
;
font-weight
:
500
;
}
/* 编辑模式按钮 */
.edit-buttons
{
position
:
fixed
;
bottom
:
160
rpx
;
/* 调整位置,使其在悬浮按钮下方 */
left
:
30
rpx
;
right
:
30
rpx
;
display
:
flex
;
justify-content
:
space-around
;
z-index
:
100
;
}
.edit-button
{
flex
:
1
;
margin
:
0
10
rpx
;
height
:
80
rpx
;
border-radius
:
40
rpx
;
display
:
flex
;
align-items
:
center
;
justify-content
:
center
;
font-size
:
32
rpx
;
font-weight
:
500
;
cursor
:
pointer
;
transition
:
background-color
0.2s
;
}
.edit-button.cancel
{
background-color
:
#f0f0f0
;
color
:
#333
;
}
.edit-button.submit
{
background-color
:
#007aff
;
color
:
white
;
}
.edit-button.cancel
:hover
{
background-color
:
#e0e0e0
;
}
.edit-button.submit
:hover
{
background-color
:
#0056b3
;
}
.edit-button-text
{
font-size
:
32
rpx
;
}
\ No newline at end of file
frontend/inversment-diary/pages/index/index.vue
View file @
a677e0e6
...
...
@@ -985,918 +985,4 @@
}
</
script
>
<
style
scoped
>
.container
{
min-height
:
100vh
;
background
:
#f5f7fa
;
padding-bottom
:
120
rpx
;
}
/* 日期选择器 */
.date-header
{
background
:
white
;
padding
:
20
rpx
30
rpx
;
border-bottom
:
1
rpx
solid
#f0f0f0
;
position
:
sticky
;
top
:
0
;
z-index
:
99
;
display
:
flex
;
justify-content
:
space-between
;
align-items
:
center
;
}
.date-selector
{
display
:
flex
;
align-items
:
center
;
padding
:
15
rpx
0
;
}
.edit-toggle
{
padding
:
15
rpx
25
rpx
;
background
:
#007aff
;
border-radius
:
25
rpx
;
cursor
:
pointer
;
transition
:
background-color
0.2s
;
}
.edit-toggle
:hover
{
background
:
#0056b3
;
}
.edit-toggle-text
{
color
:
white
;
font-size
:
28
rpx
;
font-weight
:
500
;
}
.date-text
{
color
:
#333
;
font-size
:
32
rpx
;
font-weight
:
bold
;
margin-right
:
15
rpx
;
}
.calendar-icon
{
font-size
:
28
rpx
;
color
:
#007aff
;
}
/* 自定义日历 */
.calendar-overlay
{
position
:
fixed
;
top
:
0
;
left
:
0
;
width
:
100%
;
height
:
100%
;
background
:
rgba
(
0
,
0
,
0
,
0.5
);
display
:
flex
;
align-items
:
center
;
justify-content
:
center
;
z-index
:
1000
;
}
.calendar-popup
{
background
:
white
;
width
:
90%
;
max-width
:
600
rpx
;
border-radius
:
20
rpx
;
padding
:
30
rpx
;
box-shadow
:
0
10
rpx
30
rpx
rgba
(
0
,
0
,
0
,
0.3
);
}
.calendar-header
{
display
:
flex
;
justify-content
:
space-between
;
align-items
:
center
;
margin-bottom
:
30
rpx
;
padding-bottom
:
20
rpx
;
border-bottom
:
1
rpx
solid
#f0f0f0
;
}
.calendar-title
{
font-size
:
36
rpx
;
font-weight
:
bold
;
color
:
#333
;
}
.calendar-nav
{
display
:
flex
;
gap
:
30
rpx
;
}
.nav-btn
{
width
:
60
rpx
;
height
:
60
rpx
;
background
:
#f5f5f5
;
border-radius
:
50%
;
display
:
flex
;
align-items
:
center
;
justify-content
:
center
;
font-size
:
24
rpx
;
color
:
#666
;
}
.calendar-weekdays
{
display
:
grid
;
grid-template-columns
:
repeat
(
7
,
1fr
);
gap
:
10
rpx
;
margin-bottom
:
20
rpx
;
}
.weekday
{
text-align
:
center
;
color
:
#999
;
font-size
:
24
rpx
;
padding
:
15
rpx
0
;
}
.calendar-days
{
display
:
flex
;
flex-direction
:
column
;
gap
:
5
rpx
;
}
.calendar-row
{
display
:
grid
;
grid-template-columns
:
repeat
(
7
,
1fr
);
gap
:
5
rpx
;
}
.calendar-day
{
aspect-ratio
:
1
;
display
:
flex
;
align-items
:
center
;
justify-content
:
center
;
border-radius
:
8
rpx
;
cursor
:
pointer
;
transition
:
all
0.2s
;
}
.calendar-day.other-month
{
opacity
:
0.3
;
}
.calendar-day.selected
{
background
:
#007aff
;
color
:
white
;
}
.calendar-day.today
{
background
:
#e8f4ff
;
color
:
#007aff
;
font-weight
:
bold
;
}
.calendar-day.selected.today
{
background
:
#007aff
;
color
:
white
;
}
.day-number
{
font-size
:
28
rpx
;
}
/* 可编辑字段样式 */
.editable-field
{
display
:
flex
;
align-items
:
center
;
cursor
:
pointer
;
padding
:
4
rpx
8
rpx
;
border-radius
:
6
rpx
;
transition
:
background-color
0.2s
;
position
:
relative
;
}
.editable-field
:hover
{
background-color
:
rgba
(
0
,
122
,
255
,
0.1
);
}
.edit-icon
{
font-size
:
20
rpx
;
margin-left
:
8
rpx
;
opacity
:
0.6
;
transition
:
opacity
0.2s
;
}
.editable-field
:hover
.edit-icon
{
opacity
:
1
;
}
/* 账户概览 */
.account-overview
{
background
:
white
;
margin
:
20
rpx
;
border-radius
:
16
rpx
;
padding
:
30
rpx
;
box-shadow
:
0
2
rpx
10
rpx
rgba
(
0
,
0
,
0
,
0.1
);
}
.balance-section
{
display
:
flex
;
justify-content
:
space-between
;
align-items
:
center
;
margin-bottom
:
30
rpx
;
}
.balance-left
{
flex
:
1
;
}
.balance-label
{
display
:
block
;
color
:
#666
;
font-size
:
28
rpx
;
margin-bottom
:
10
rpx
;
}
.balance-amount
{
display
:
block
;
color
:
#333
;
font-size
:
48
rpx
;
font-weight
:
bold
;
}
.balance-input
{
max-width
:
300
rpx
;
font-size
:
48
rpx
;
font-weight
:
bold
;
color
:
#333
;
border
:
2
rpx
solid
#007aff
;
border-radius
:
12
rpx
;
padding
:
15
rpx
20
rpx
;
background
:
#f8f9fa
;
box-shadow
:
0
2
rpx
8
rpx
rgba
(
0
,
122
,
255
,
0.1
);
}
.profit-input
{
max-width
:
200
rpx
;
font-size
:
28
rpx
;
font-weight
:
bold
;
color
:
#333
;
border
:
2
rpx
solid
#007aff
;
border-radius
:
10
rpx
;
padding
:
12
rpx
16
rpx
;
background
:
#f8f9fa
;
text-align
:
center
;
box-shadow
:
0
2
rpx
8
rpx
rgba
(
0
,
122
,
255
,
0.1
);
}
.profit-input-wrapper
{
margin-top
:
8
rpx
;
display
:
flex
;
justify-content
:
center
;
}
.balance-right
{
text-align
:
center
;
}
.asset-label
{
display
:
block
;
color
:
#666
;
font-size
:
24
rpx
;
margin-bottom
:
10
rpx
;
}
.progress-circle
{
width
:
80
rpx
;
height
:
80
rpx
;
border-radius
:
50%
;
display
:
flex
;
align-items
:
center
;
justify-content
:
center
;
position
:
relative
;
}
/* 不同仓位等级的颜色 - 这些样式已由动态样式替代,可以保留作为备用 */
.progress-circle.position-safe
{
/* background: conic-gradient(#00d4aa 0deg 306deg, #e6f7ff 306deg 360deg); */
}
.progress-circle.position-medium
{
/* background: conic-gradient(#ffa502 0deg 306deg, #e6f7ff 306deg 360deg); */
}
.progress-circle.position-high
{
/* background: conic-gradient(#ff4757 0deg 306deg, #e6f7ff 306deg 360deg); */
}
.progress-circle
::after
{
content
:
''
;
width
:
60
rpx
;
height
:
60
rpx
;
background
:
white
;
border-radius
:
50%
;
position
:
absolute
;
}
.progress-text
{
font-size
:
24
rpx
;
font-weight
:
bold
;
z-index
:
1
;
}
/* 不同仓位等级的文字颜色 */
.position-safe
.progress-text
{
color
:
#00d4aa
;
}
.position-medium
.progress-text
{
color
:
#ffa502
;
}
.position-high
.progress-text
{
color
:
#ff4757
;
}
.profit-section
{
display
:
flex
;
justify-content
:
space-between
;
}
.profit-item
{
text-align
:
center
;
}
.profit-label
{
display
:
block
;
color
:
#666
;
font-size
:
24
rpx
;
margin-bottom
:
8
rpx
;
}
.profit-value
{
display
:
block
;
font-size
:
28
rpx
;
font-weight
:
bold
;
}
.profit-value.positive
{
color
:
#ff4757
;
}
.profit-value.negative
{
color
:
#00d4aa
;
}
/* 持仓 */
.holdings-section
{
margin
:
20
rpx
;
}
.section-header
{
display
:
flex
;
justify-content
:
space-between
;
align-items
:
center
;
margin-bottom
:
20
rpx
;
}
.section-title
{
display
:
block
;
color
:
#333
;
font-size
:
32
rpx
;
font-weight
:
bold
;
}
.add-holding-btn
{
display
:
flex
;
align-items
:
center
;
gap
:
8
rpx
;
padding
:
8
rpx
15
rpx
;
background
:
#007aff
;
border-radius
:
20
rpx
;
color
:
white
;
font-size
:
24
rpx
;
font-weight
:
500
;
cursor
:
pointer
;
transition
:
background-color
0.2s
;
}
.add-holding-btn
:hover
{
background
:
#0056b3
;
}
.add-icon
{
font-size
:
28
rpx
;
}
.add-text
{
font-size
:
28
rpx
;
}
.holdings-grid
{
display
:
grid
;
grid-template-columns
:
repeat
(
2
,
1fr
);
gap
:
20
rpx
;
}
.holding-card
{
background
:
white
;
border-radius
:
16
rpx
;
padding
:
25
rpx
;
box-shadow
:
0
2
rpx
10
rpx
rgba
(
0
,
0
,
0
,
0.1
);
position
:
relative
;
}
.card-deleted
{
opacity
:
0.5
;
pointer-events
:
none
;
background
:
#f5f5f5
;
border
:
2
rpx
dashed
#ccc
;
}
.card-deleted
.stock-name
,
.card-deleted
.amount-value
,
.card-deleted
.price-value
{
color
:
#999
;
text-decoration
:
line-through
;
}
.card-deleted
.delete-btn
{
background
:
#00d4aa
;
pointer-events
:
auto
;
}
.delete-btn
{
position
:
absolute
;
top
:
15
rpx
;
right
:
15
rpx
;
background
:
#ff4757
;
border-radius
:
50%
;
width
:
50
rpx
;
height
:
50
rpx
;
display
:
flex
;
align-items
:
center
;
justify-content
:
center
;
font-size
:
30
rpx
;
color
:
white
;
z-index
:
1
;
cursor
:
pointer
;
transition
:
background-color
0.2s
;
}
.delete-btn
:hover
{
background
:
#e03e4e
;
}
.delete-icon
{
font-size
:
30
rpx
;
}
.holding-header
{
display
:
flex
;
justify-content
:
space-between
;
align-items
:
flex-start
;
margin-bottom
:
20
rpx
;
}
.stock-name-wrapper
{
display
:
flex
;
align-items
:
center
;
}
.stock-name
{
color
:
#333
;
font-size
:
30
rpx
;
font-weight
:
bold
;
margin-right
:
8
rpx
;
}
.lock-icon
{
font-size
:
20
rpx
;
color
:
#999
;
}
.stock-name-input
{
max-width
:
200
rpx
;
font-size
:
30
rpx
;
font-weight
:
bold
;
color
:
#333
;
border
:
2
rpx
solid
#007aff
;
border-radius
:
10
rpx
;
padding
:
12
rpx
16
rpx
;
background
:
#f8f9fa
;
text-align
:
center
;
box-shadow
:
0
2
rpx
8
rpx
rgba
(
0
,
122
,
255
,
0.1
);
}
.position-percentage
{
font-size
:
22
rpx
;
color
:
#007aff
;
background
:
#e8f4ff
;
padding
:
4
rpx
10
rpx
;
border-radius
:
6
rpx
;
}
.stock-change
{
font-size
:
22
rpx
;
padding
:
4
rpx
10
rpx
;
border-radius
:
6
rpx
;
}
.stock-change.positive
{
color
:
#ff4757
;
background
:
#fff1f0
;
}
.stock-change.negative
{
color
:
#00d4aa
;
background
:
#f0fff4
;
}
.change-input
{
max-width
:
100
rpx
;
font-size
:
24
rpx
;
color
:
#333
;
padding
:
12
rpx
16
rpx
;
border-radius
:
8
rpx
;
border
:
2
rpx
solid
#007aff
;
background
:
#f8f9fa
;
text-align
:
right
;
font-weight
:
500
;
box-shadow
:
0
1
rpx
6
rpx
rgba
(
0
,
122
,
255
,
0.1
);
transition
:
all
0.2s
;
}
.stock-price
{
display
:
flex
;
justify-content
:
space-between
;
align-items
:
center
;
margin-bottom
:
25
rpx
;
}
.price-value
{
font-size
:
40
rpx
;
font-weight
:
bold
;
color
:
#333
;
}
.price-input
{
max-width
:
100
rpx
;
font-size
:
40
rpx
;
font-weight
:
bold
;
color
:
#333
;
border
:
2
rpx
solid
#007aff
;
border-radius
:
10
rpx
;
padding
:
12
rpx
16
rpx
;
background
:
#f8f9fa
;
text-align
:
right
;
box-shadow
:
0
2
rpx
8
rpx
rgba
(
0
,
122
,
255
,
0.1
);
}
.holding-amounts
{
margin-bottom
:
25
rpx
;
}
.amount-labels
{
display
:
flex
;
justify-content
:
space-between
;
margin-bottom
:
8
rpx
;
}
.amount-label
{
color
:
#666
;
font-size
:
22
rpx
;
}
.amount-row
{
display
:
flex
;
justify-content
:
space-between
;
margin-bottom
:
8
rpx
;
}
.amount-field
{
flex
:
1
;
margin-right
:
10
rpx
;
display
:
flex
;
justify-content
:
center
;
align-items
:
center
;
}
.amount-field
:last-child
{
margin-right
:
0
;
}
.amount-value
{
color
:
#333
;
font-weight
:
bold
;
font-size
:
24
rpx
;
cursor
:
pointer
;
padding
:
2
rpx
4
rpx
;
border-radius
:
4
rpx
;
transition
:
background-color
0.2s
;
}
.amount-value
:hover
{
background-color
:
#f0f0f0
;
}
.amount-value.profit
{
color
:
#ff4757
;
}
.amount-value.loss
{
color
:
#00d4aa
;
}
.amount-input
{
max-width
:
150
rpx
;
font-size
:
24
rpx
;
color
:
#333
;
padding
:
12
rpx
16
rpx
;
border-radius
:
8
rpx
;
border
:
2
rpx
solid
#007aff
;
background
:
#f8f9fa
;
text-align
:
right
;
font-weight
:
500
;
box-shadow
:
0
1
rpx
6
rpx
rgba
(
0
,
122
,
255
,
0.1
);
transition
:
all
0.2s
;
}
/* 今日操作 */
.operations-section
{
margin
:
20
rpx
;
}
.operations-list
{
background
:
white
;
border-radius
:
16
rpx
;
overflow
:
hidden
;
box-shadow
:
0
2
rpx
10
rpx
rgba
(
0
,
0
,
0
,
0.1
);
}
.operation-group
{
border-bottom
:
1
rpx
solid
#f5f5f5
;
padding
:
30
rpx
;
}
.operation-group
:last-child
{
border-bottom
:
none
;
}
.operation-stock-header
{
display
:
flex
;
align-items
:
center
;
justify-content
:
space-between
;
margin-bottom
:
20
rpx
;
gap
:
15
rpx
;
}
.operation-stock
{
color
:
#333
;
font-size
:
28
rpx
;
font-weight
:
bold
;
flex-shrink
:
0
;
}
.current-price
{
font-size
:
26
rpx
;
font-weight
:
bold
;
flex-shrink
:
0
;
}
.current-price.positive
{
color
:
#ff4757
;
}
.current-price.negative
{
color
:
#00d4aa
;
}
.price-change
{
font-size
:
22
rpx
;
padding
:
2
rpx
8
rpx
;
border-radius
:
4
rpx
;
font-weight
:
500
;
flex-shrink
:
0
;
}
.price-change.positive
{
color
:
#ff4757
;
background
:
#fff1f0
;
}
.price-change.negative
{
color
:
#00d4aa
;
background
:
#f0fff4
;
}
.holder-count
{
font-size
:
20
rpx
;
color
:
#007aff
;
background
:
#e8f4ff
;
padding
:
4
rpx
8
rpx
;
border-radius
:
6
rpx
;
font-weight
:
500
;
flex-shrink
:
0
;
}
.operations-list-continuous
{
margin-bottom
:
20
rpx
;
}
.operations-list-continuous
.operation-item
{
margin-bottom
:
10
rpx
;
padding
:
15
rpx
;
background
:
#f8f9fa
;
border-radius
:
8
rpx
;
}
.operations-list-continuous
.operation-item
:last-child
{
margin-bottom
:
0
;
}
.operation-notes
{
margin-top
:
15
rpx
;
}
.reasons-section
,
.analyses-section
{
margin-bottom
:
20
rpx
;
}
.reasons-section
:last-child
,
.analyses-section
:last-child
{
margin-bottom
:
0
;
}
.section-subtitle
{
display
:
block
;
font-size
:
26
rpx
;
font-weight
:
bold
;
color
:
#333
;
margin-bottom
:
15
rpx
;
}
.reason-item
,
.analysis-item
{
background
:
#fffbeb
;
padding
:
20
rpx
;
border-radius
:
8
rpx
;
margin-bottom
:
10
rpx
;
border-left
:
4
rpx
solid
#d97706
;
}
.analysis-item
{
background
:
#f0f9ff
;
border-left
:
4
rpx
solid
#0369a1
;
}
.reason-item
:last-child
,
.analysis-item
:last-child
{
margin-bottom
:
0
;
}
.reason-content
,
.analysis-content
{
display
:
block
;
font-size
:
24
rpx
;
line-height
:
1.6
;
margin-bottom
:
8
rpx
;
}
.reason-content
{
color
:
#d97706
;
}
.analysis-content
{
color
:
#0369a1
;
}
.reason-date
,
.analysis-date
{
display
:
block
;
font-size
:
20
rpx
;
color
:
#999
;
text-align
:
right
;
}
.operation-header
{
display
:
flex
;
justify-content
:
space-between
;
align-items
:
center
;
margin-bottom
:
10
rpx
;
}
.operation-type
{
display
:
flex
;
align-items
:
center
;
padding
:
8
rpx
16
rpx
;
border-radius
:
8
rpx
;
gap
:
8
rpx
;
}
.operation-type.buy
{
background
:
#fff1f0
;
color
:
#ff4757
;
}
.operation-type.sell
{
background
:
#f0fff4
;
color
:
#00d4aa
;
}
.type-icon
{
font-size
:
20
rpx
;
}
.type-text
{
font-size
:
24
rpx
;
}
.operation-details
{
color
:
#666
;
font-size
:
24
rpx
;
}
/* 悬浮按钮 */
.floating-button
{
position
:
fixed
;
right
:
30
rpx
;
bottom
:
160
rpx
;
width
:
100
rpx
;
height
:
100
rpx
;
background
:
#007aff
;
border-radius
:
50%
;
display
:
flex
;
align-items
:
center
;
justify-content
:
center
;
box-shadow
:
0
4
rpx
12
rpx
rgba
(
0
,
122
,
255
,
0.4
);
z-index
:
100
;
}
.float-icon
{
color
:
white
;
font-size
:
48
rpx
;
font-weight
:
300
;
}
/* 底部按钮 */
.bottom-button
{
position
:
fixed
;
bottom
:
30
rpx
;
left
:
30
rpx
;
right
:
30
rpx
;
height
:
80
rpx
;
background
:
#007aff
;
border-radius
:
40
rpx
;
display
:
flex
;
align-items
:
center
;
justify-content
:
center
;
box-shadow
:
0
4
rpx
12
rpx
rgba
(
0
,
122
,
255
,
0.4
);
z-index
:
100
;
}
.bottom-text
{
color
:
white
;
font-size
:
32
rpx
;
font-weight
:
500
;
}
/* 编辑模式按钮 */
.edit-buttons
{
position
:
fixed
;
bottom
:
160
rpx
;
/* 调整位置,使其在悬浮按钮下方 */
left
:
30
rpx
;
right
:
30
rpx
;
display
:
flex
;
justify-content
:
space-around
;
z-index
:
100
;
}
.edit-button
{
flex
:
1
;
margin
:
0
10
rpx
;
height
:
80
rpx
;
border-radius
:
40
rpx
;
display
:
flex
;
align-items
:
center
;
justify-content
:
center
;
font-size
:
32
rpx
;
font-weight
:
500
;
cursor
:
pointer
;
transition
:
background-color
0.2s
;
}
.edit-button.cancel
{
background-color
:
#f0f0f0
;
color
:
#333
;
}
.edit-button.submit
{
background-color
:
#007aff
;
color
:
white
;
}
.edit-button.cancel
:hover
{
background-color
:
#e0e0e0
;
}
.edit-button.submit
:hover
{
background-color
:
#0056b3
;
}
.edit-button-text
{
font-size
:
32
rpx
;
}
</
style
>
<
style
src=
"./index.css"
></
style
>
\ No newline at end of file
frontend/inversment-diary/project.config.json
0 → 100644
View file @
a677e0e6
{
"description"
:
"项目配置文件"
,
"packOptions"
:
{
"ignore"
:
[]
},
"setting"
:
{
"bundle"
:
false
,
"userConfirmedBundleSwitch"
:
false
,
"urlCheck"
:
true
,
"scopeDataCheck"
:
false
,
"coverView"
:
true
,
"es6"
:
true
,
"postcss"
:
true
,
"compileHotReLoad"
:
false
,
"lazyloadPlaceholderEnable"
:
false
,
"preloadBackgroundData"
:
false
,
"minified"
:
true
,
"autoAudits"
:
false
,
"newFeature"
:
false
,
"uglifyFileName"
:
false
,
"uploadWithSourceMap"
:
true
,
"useIsolateContext"
:
true
,
"nodeModules"
:
false
,
"enhance"
:
true
,
"useMultiFrameRuntime"
:
true
,
"useApiHook"
:
true
,
"useApiHostProcess"
:
false
,
"showShadowRootInWxmlPanel"
:
true
,
"packNpmManually"
:
false
,
"enableEngineNative"
:
false
,
"packNpmRelationList"
:
[],
"minifyWXSS"
:
true
,
"showES6CompileOption"
:
false
},
"compileType"
:
"miniprogram"
,
"libVersion"
:
"3.9.2"
,
"appid"
:
"wxe4dc01e034807383"
,
"projectname"
:
"miniprogram-1"
,
"debugOptions"
:
{
"hidedInDevtools"
:
[]
},
"scripts"
:
{},
"staticServerOptions"
:
{
"baseURL"
:
""
,
"servePath"
:
""
},
"isGameTourist"
:
false
,
"condition"
:
{
"search"
:
{
"list"
:
[]
},
"conversation"
:
{
"list"
:
[]
},
"game"
:
{
"list"
:
[]
},
"plugin"
:
{
"list"
:
[]
},
"gamePlugin"
:
{
"list"
:
[]
},
"miniprogram"
:
{
"list"
:
[]
}
}
}
\ No newline at end of file
frontend/inversment-diary/unpackage/dist/dev/.sourcemap/mp-weixin/app.js.map
deleted
100644 → 0
View file @
c5b00f12
{"version":3,"file":"app.js","sources":["App.vue","main.js"],"sourcesContent":["<script>\r\n\texport default {\r\n\t\tonLaunch: function() {\r\n\t\t\tconsole.log('App Launch')\r\n\t\t},\r\n\t\tonShow: function() {\r\n\t\t\tconsole.log('App Show')\r\n\t\t},\r\n\t\tonHide: function() {\r\n\t\t\tconsole.log('App Hide')\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style>\r\n\t/*每个页面公共css */\r\n</style>\n","import App from './App'\n\n// #ifndef VUE3\nimport Vue from 'vue'\nimport './uni.promisify.adaptor'\nVue.config.productionTip = false\nApp.mpType = 'app'\nconst app = new Vue({\n ...App\n})\napp.$mount()\n// #endif\n\n// #ifdef VUE3\nimport { createSSRApp } from 'vue'\nexport function createApp() {\n const app = createSSRApp(App)\n return {\n app\n }\n}\n// #endif"],"names":["uni","createSSRApp","App"],"mappings":";;;;;;AACC,MAAK,YAAU;AAAA,EACd,UAAU,WAAW;AACpBA,kBAAAA,MAAA,MAAA,OAAA,gBAAY,YAAY;AAAA,EACxB;AAAA,EACD,QAAQ,WAAW;AAClBA,kBAAAA,MAAY,MAAA,OAAA,gBAAA,UAAU;AAAA,EACtB;AAAA,EACD,QAAQ,WAAW;AAClBA,kBAAAA,MAAY,MAAA,OAAA,iBAAA,UAAU;AAAA,EACvB;AACD;ACIM,SAAS,YAAY;AAC1B,QAAM,MAAMC,cAAY,aAACC,SAAG;AAC5B,SAAO;AAAA,IACL;AAAA,EACD;AACH;;;"}
\ No newline at end of file
frontend/inversment-diary/unpackage/dist/dev/.sourcemap/mp-weixin/common/assets.js.map
deleted
100644 → 0
View file @
c5b00f12
{"version":3,"file":"assets.js","sources":["static/logo.png"],"sourcesContent":["export default \"__VITE_ASSET__46719607__\""],"names":[],"mappings":";AAAA,MAAe,aAAA;;"}
\ No newline at end of file
frontend/inversment-diary/unpackage/dist/dev/.sourcemap/mp-weixin/common/vendor.js.map
deleted
100644 → 0
View file @
c5b00f12
Source diff could not be displayed: it is too large. Options to address this:
view the blob
.
frontend/inversment-diary/unpackage/dist/dev/.sourcemap/mp-weixin/pages/index/index.js.map
deleted
100644 → 0
View file @
c5b00f12
{"version":3,"file":"index.js","sources":["pages/index/index.vue","../../../../HBuilder/HBuilderX/plugins/uniapp-cli-vite/uniPage:/cGFnZXMvaW5kZXgvaW5kZXgudnVl"],"sourcesContent":["<template>\r\n\t<view class=\"container\">\r\n\t\t<!-- 日期选择器 -->\r\n\t\t<view class=\"date-header\">\r\n\t\t\t<view class=\"date-selector\" @tap=\"showCalendar\">\r\n\t\t\t\t<text class=\"date-text\">{{ currentDateText }}</text>\r\n\t\t\t\t<text class=\"calendar-icon\">📅</text>\r\n\t\t\t</view>\r\n\t\t\t<view class=\"edit-toggle\" @tap=\"toggleEditMode\">\r\n\t\t\t\t<text class=\"edit-toggle-text\">{{ isEditMode ? '取消编辑' : '编辑' }}</text>\r\n\t\t\t</view>\r\n\t\t</view>\r\n\r\n\t\t<!-- 自定义日历弹窗 -->\r\n\t\t<view class=\"calendar-overlay\" v-if=\"showCalendarPicker\" @tap=\"hideCalendar\">\r\n\t\t\t<view class=\"calendar-popup\" @tap.stop>\r\n\t\t\t\t<view class=\"calendar-header\">\r\n\t\t\t\t\t<text class=\"calendar-title\">{{ calendarYear }}年{{ calendarMonth }}月</text>\r\n\t\t\t\t\t<view class=\"calendar-nav\">\r\n\t\t\t\t\t\t<text class=\"nav-btn\" @tap=\"prevMonth\">◀</text>\r\n\t\t\t\t\t\t<text class=\"nav-btn\" @tap=\"nextMonth\">▶</text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t\t<view class=\"calendar-weekdays\">\r\n\t\t\t\t\t<text class=\"weekday\">一</text>\r\n\t\t\t\t\t<text class=\"weekday\">二</text>\r\n\t\t\t\t\t<text class=\"weekday\">三</text>\r\n\t\t\t\t\t<text class=\"weekday\">四</text>\r\n\t\t\t\t\t<text class=\"weekday\">五</text>\r\n\t\t\t\t\t<text class=\"weekday\">六</text>\r\n\t\t\t\t\t<text class=\"weekday\">日</text>\r\n\t\t\t\t</view>\r\n\t\t\t\t<view class=\"calendar-days\">\r\n\t\t\t\t\t<view class=\"calendar-row\" v-for=\"(week, weekIndex) in calendarWeeks\" :key=\"weekIndex\">\r\n\t\t\t\t\t\t<view \r\n\t\t\t\t\t\t\tclass=\"calendar-day\" \r\n\t\t\t\t\t\t\tv-for=\"(day, dayIndex) in week\" \r\n\t\t\t\t\t\t\t:key=\"dayIndex\"\r\n\t\t\t\t\t\t\t:class=\"{\r\n\t\t\t\t\t\t\t\t'other-month': !day.isCurrentMonth,\r\n\t\t\t\t\t\t\t\t'selected': day.isSelected,\r\n\t\t\t\t\t\t\t\t'today': day.isToday\r\n\t\t\t\t\t\t\t}\"\r\n\t\t\t\t\t\t\t@tap=\"selectDate(day)\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t<text class=\"day-number\">{{ day.day }}</text>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t</view>\r\n\r\n\t\t<!-- 账户概览 -->\r\n\t\t<view class=\"account-overview\">\r\n\t\t\t<view class=\"balance-section\">\r\n\t\t\t\t<view class=\"balance-left\">\r\n\t\t\t\t\t<text class=\"balance-label\">账户余额</text>\r\n\t\t\t\t\t<view v-if=\"!isEditMode\" class=\"balance-amount\">¥{{ accountBalance }}</view>\r\n\t\t\t\t\t<input v-else class=\"balance-input\" v-model=\"editData.accountBalance\" type=\"text\" placeholder=\"请输入账户余额\" />\r\n\t\t\t\t</view>\r\n\t\t\t\t<view class=\"balance-right\">\r\n\t\t\t\t\t<text class=\"asset-label\">持仓仓位</text>\r\n\t\t\t\t\t<view class=\"progress-circle\" :class=\"positionLevelClass\" :style=\"progressStyle\" @tap=\"testPosition\">\r\n\t\t\t\t\t\t<text class=\"progress-text\">{{ calculatedPositionPercentage }}%</text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t\t<view class=\"profit-section\">\r\n\t\t\t\t<view class=\"profit-item\">\r\n\t\t\t\t\t<text class=\"profit-label\">今日盈亏</text>\r\n\t\t\t\t\t<view v-if=\"!isEditMode\" class=\"profit-value positive\">{{ todayProfit }}</view>\r\n\t\t\t\t\t<view v-else class=\"profit-input-wrapper\">\r\n\t\t\t\t\t\t<input class=\"profit-input\" v-model=\"editData.todayProfit\" type=\"text\" placeholder=\"请输入今日盈亏\" />\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t\t<view class=\"profit-item\">\r\n\t\t\t\t\t<text class=\"profit-label\">盈亏比例</text>\r\n\t\t\t\t\t<text class=\"profit-value positive\">{{ calculatedProfitRatio }}%</text>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t</view>\r\n\r\n\t\t<!-- 持仓 -->\r\n\t\t<view class=\"holdings-section\">\r\n\t\t\t<view class=\"section-header\">\r\n\t\t\t\t<text class=\"section-title\">持仓</text>\r\n\t\t\t\t<view v-if=\"isEditMode\" class=\"add-holding-btn\" @tap=\"addHolding\">\r\n\t\t\t\t\t<text class=\"add-icon\">+</text>\r\n\t\t\t\t\t<text class=\"add-text\">新增</text>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t\t<view class=\"holdings-grid\">\r\n\t\t\t\t<view \r\n\t\t\t\t\tclass=\"holding-card\" \r\n\t\t\t\t\tv-for=\"(holding, index) in holdings\" \r\n\t\t\t\t\t:key=\"index\"\r\n\t\t\t\t\t:class=\"{ 'card-deleted': holding.isDeleted }\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<!-- 删除按钮 -->\r\n\t\t\t\t\t<view v-if=\"isEditMode\" class=\"delete-btn\" @tap=\"toggleDeleteHolding(index)\">\r\n\t\t\t\t\t\t<text class=\"delete-icon\">{{ holding.isDeleted ? '↶' : '×' }}</text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t\r\n\t\t\t\t\t<view class=\"holding-header\">\r\n\t\t\t\t\t\t<view v-if=\"!isEditMode || holding.isNameLocked\" class=\"stock-name-wrapper\">\r\n\t\t\t\t\t\t\t<text class=\"stock-name\">{{ holding.name }}</text>\r\n\t\t\t\t\t\t\t<text v-if=\"holding.isNameLocked\" class=\"lock-icon\">🔒</text>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t<input v-else class=\"stock-name-input\" v-model=\"editData.holdings[index].name\" type=\"text\" placeholder=\"股票名称\" />\r\n\t\t\t\t\t\t<text class=\"position-percentage\">仓位 {{ holding.position }}</text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t\r\n\t\t\t\t\t<view class=\"stock-price\">\r\n\t\t\t\t\t\t<view v-if=\"!isEditMode\" class=\"price-value\">{{ holding.price }}</view>\r\n\t\t\t\t\t\t<input v-else class=\"price-input\" v-model=\"editData.holdings[index].price\" type=\"text\" placeholder=\"价格\" />\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t<view v-if=\"!isEditMode\" class=\"stock-change\" :class=\"holding.changeClass\">{{ holding.change }}</view>\r\n\t\t\t\t\t\t<input v-else class=\"change-input\" v-model=\"editData.holdings[index].change\" type=\"text\" placeholder=\"涨跌幅\" />\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t\r\n\t\t\t\t\t<view class=\"holding-amounts\">\r\n\t\t\t\t\t\t<view class=\"amount-labels\">\r\n\t\t\t\t\t\t\t<text class=\"amount-label\">持仓金额</text>\r\n\t\t\t\t\t\t\t<text class=\"amount-label\">盈亏金额</text>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t<view class=\"amount-row\">\r\n\t\t\t\t\t\t\t<view class=\"amount-field\">\r\n\t\t\t\t\t\t\t\t<view v-if=\"!isEditMode\" class=\"amount-value\">¥{{ holding.amount }}</view>\r\n\t\t\t\t\t\t\t\t<input v-else class=\"amount-input\" v-model=\"editData.holdings[index].amount\" type=\"text\" placeholder=\"持仓金额\" />\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t<view class=\"amount-field\">\r\n\t\t\t\t\t\t\t\t<view v-if=\"!isEditMode\" class=\"amount-value\" :class=\"holding.profitLoss.startsWith('+') ? 'profit' : 'loss'\">{{ holding.profitLoss }}</view>\r\n\t\t\t\t\t\t\t\t<input v-else class=\"amount-input\" v-model=\"editData.holdings[index].profitLoss\" type=\"text\" placeholder=\"盈亏金额\" />\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t</view>\r\n\r\n\t\t<!-- 今日操作 -->\r\n\t\t<view class=\"operations-section\">\r\n\t\t\t<text class=\"section-title\">今日操作</text>\r\n\t\t\t<view class=\"operations-list\">\r\n\t\t\t\t<view class=\"operation-group\" v-for=\"(group, index) in operations\" :key=\"index\">\r\n\t\t\t\t\t<view class=\"operation-stock-header\">\r\n\t\t\t\t\t\t<text class=\"operation-stock\">{{ group.stockName }}</text>\r\n\t\t\t\t\t\t<text class=\"current-price\" :class=\"group.priceChange.startsWith('+') ? 'positive' : 'negative'\">{{ group.currentPrice }}</text>\r\n\t\t\t\t\t\t<text class=\"price-change\" :class=\"group.priceChange.startsWith('+') ? 'positive' : 'negative'\">{{ group.priceChange }}</text>\r\n\t\t\t\t\t\t<text class=\"holder-count\">{{ group.holderCount }}人持有</text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t\r\n\t\t\t\t\t<!-- 连续的操作记录 -->\r\n\t\t\t\t\t<view class=\"operations-list-continuous\">\r\n\t\t\t\t\t\t<view class=\"operation-item\" v-for=\"(op, opIndex) in group.operations\" :key=\"opIndex\">\r\n\t\t\t\t\t\t\t<view class=\"operation-header\">\r\n\t\t\t\t\t\t\t\t<view class=\"operation-type\" :class=\"op.type\">\r\n\t\t\t\t\t\t\t\t\t<text class=\"type-icon\">{{ op.type === 'buy' ? '↑' : '↓' }}</text>\r\n\t\t\t\t\t\t\t\t\t<text class=\"type-text\">{{ op.typeText }}</text>\r\n\t\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t\t<text class=\"operation-details\">价格: {{ op.price }} 数量: {{ op.quantity }}</text>\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t\r\n\t\t\t\t\t<!-- 操作理由和分析 -->\r\n\t\t\t\t\t<view class=\"operation-notes\" v-if=\"(group.reasons && group.reasons.length > 0) || (group.analyses && group.analyses.length > 0)\">\r\n\t\t\t\t\t\t<!-- 操作理由列表 -->\r\n\t\t\t\t\t\t<view class=\"reasons-section\" v-if=\"group.reasons && group.reasons.length > 0\">\r\n\t\t\t\t\t\t\t<text class=\"section-subtitle\">操作理由</text>\r\n\t\t\t\t\t\t\t<view class=\"reason-item\" v-for=\"(reason, reasonIndex) in group.reasons\" :key=\"reasonIndex\">\r\n\t\t\t\t\t\t\t\t<text class=\"reason-content\">{{ reason.content }}</text>\r\n\t\t\t\t\t\t\t\t<text class=\"reason-date\">{{ reason.date }}</text>\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t<!-- 马后炮分析列表 -->\r\n\t\t\t\t\t\t<view class=\"analyses-section\" v-if=\"group.analyses && group.analyses.length > 0\">\r\n\t\t\t\t\t\t\t<text class=\"section-subtitle\">马后炮分析</text>\r\n\t\t\t\t\t\t\t<view class=\"analysis-item\" v-for=\"(analysis, analysisIndex) in group.analyses\" :key=\"analysisIndex\">\r\n\t\t\t\t\t\t\t\t<text class=\"analysis-content\">{{ analysis.content }}</text>\r\n\t\t\t\t\t\t\t\t<text class=\"analysis-date\">{{ analysis.date }}</text>\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t</view>\r\n\r\n\t\t<!-- 悬浮按钮 - 只在非编辑模式显示 -->\r\n\t\t<view class=\"floating-button\" v-if=\"!isEditMode\" @tap=\"addRecord\">\r\n\t\t\t<text class=\"float-icon\">+</text>\r\n\t\t</view>\r\n\r\n\t\t<!-- 编辑模式底部按钮 -->\r\n\t\t<view class=\"edit-buttons\" v-if=\"isEditMode\">\r\n\t\t\t<view class=\"edit-button cancel\" @tap=\"cancelEdit\">\r\n\t\t\t\t<text class=\"edit-button-text\">取消</text>\r\n\t\t\t</view>\r\n\t\t\t<view class=\"edit-button submit\" @tap=\"submitEdit\">\r\n\t\t\t\t<text class=\"edit-button-text\">保存</text>\r\n\t\t\t</view>\r\n\t\t</view>\r\n\r\n\t\t<!-- 底部提交修改按钮 - 只有当前是最新交易日且有修改时才显示 -->\r\n\t\t<view class=\"bottom-button\" v-if=\"!isEditMode && showSubmitButton\" @tap=\"submitChanges\">\r\n\t\t\t<text class=\"bottom-text\">提交修改</text>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\texport default {\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\tcurrentDate: '',\r\n\t\t\t\tcurrentDateText: '',\r\n\t\t\t\tshowCalendarPicker: false,\r\n\t\t\t\tcalendarYear: new Date().getFullYear(),\r\n\t\t\t\tcalendarMonth: new Date().getMonth() + 1,\r\n\t\t\t\tcalendarWeeks: [],\r\n\t\t\t\tselectedDate: null,\r\n\t\t\t\tpositionPercentage: 85, // 持仓仓位百分比 - 保留用于测试\r\n\t\t\t\thasModifications: false, // 是否有修改\r\n\t\t\t\tlatestTradingDate: '', // 最新交易日 - 由initDate方法设置\r\n\t\t\t\tisEditMode: false, // 是否处于编辑模式\r\n\t\t\t\t\r\n\t\t\t\t// 可编辑的基础数据\r\n\t\t\t\taccountBalance: '332,646', // 账户余额\r\n\t\t\t\ttodayProfit: '+¥4,820', // 今日盈亏\r\n\t\t\t\t\r\n\t\t\t\t// 编辑模式的临时数据\r\n\t\t\t\teditData: {\r\n\t\t\t\t\taccountBalance: '',\r\n\t\t\t\t\ttodayProfit: '',\r\n\t\t\t\t\tholdings: []\r\n\t\t\t\t},\r\n\t\t\t\tholdings: [\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tname: '北方稀土',\r\n\t\t\t\t\t\tstockCode: '600111',\r\n\t\t\t\t\t\tchange: '+9.91%',\r\n\t\t\t\t\t\tchangeClass: 'positive',\r\n\t\t\t\t\t\tamount: '45,900',\r\n\t\t\t\t\t\tposition: '14%',\r\n\t\t\t\t\t\tposition2: '20%',\r\n\t\t\t\t\t\tprice: '38.25',\r\n\t\t\t\t\t\tprofitLoss: '+1,200',\r\n\t\t\t\t\t\tisDeleted: false,\r\n\t\t\t\t\t\tisNameLocked: true\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tname: '中国电建',\r\n\t\t\t\t\t\tstockCode: '601669',\r\n\t\t\t\t\t\tchange: '+14.56%',\r\n\t\t\t\t\t\tchangeClass: 'positive',\r\n\t\t\t\t\t\tamount: '11,800',\r\n\t\t\t\t\t\tposition: '20%',\r\n\t\t\t\t\t\tposition2: '20%',\r\n\t\t\t\t\t\tprice: '11.8',\r\n\t\t\t\t\t\tprofitLoss: '-800',\r\n\t\t\t\t\t\tisDeleted: false,\r\n\t\t\t\t\t\tisNameLocked: true\r\n\t\t\t\t\t}\r\n\t\t\t\t],\r\n\t\t\t\toperations: [\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tstockName: '北方稀土',\r\n\t\t\t\t\t\tcurrentPrice: '38.25',\r\n\t\t\t\t\t\tpriceChange: '+9.91%',\r\n\t\t\t\t\t\tholderCount: 120,\r\n\t\t\t\t\t\toperations: [\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\ttype: 'buy',\r\n\t\t\t\t\t\t\t\ttypeText: '买入',\r\n\t\t\t\t\t\t\t\tprice: '11.2',\r\n\t\t\t\t\t\t\t\tquantity: '1000'\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\ttype: 'sell',\r\n\t\t\t\t\t\t\t\ttypeText: '卖出',\r\n\t\t\t\t\t\t\t\tprice: '11.7',\r\n\t\t\t\t\t\t\t\tquantity: '1000'\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t],\r\n\t\t\t\t\t\treasons: [\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tcontent: '看好稀土行业发展前景,近期有政策利好',\r\n\t\t\t\t\t\t\t\tdate: '2024-01-15'\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tcontent: '国家新能源汽车政策持续推进,稀土需求增长',\r\n\t\t\t\t\t\t\t\tdate: '2024-01-14'\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t],\r\n\t\t\t\t\t\tanalyses: [\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tcontent: '买入价格合适,但是买入时机不够理想,应该在大盘调整时买入',\r\n\t\t\t\t\t\t\t\tdate: '2024-01-15'\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tcontent: '卖出时机把握较好,获得了不错的收益',\r\n\t\t\t\t\t\t\t\tdate: '2024-01-15'\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tstockName: '中国电建',\r\n\t\t\t\t\t\tcurrentPrice: '11.8',\r\n\t\t\t\t\t\tpriceChange: '+14.56%',\r\n\t\t\t\t\t\tholderCount: 80,\r\n\t\t\t\t\t\toperations: [\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\ttype: 'buy',\r\n\t\t\t\t\t\t\t\ttypeText: '买入',\r\n\t\t\t\t\t\t\t\tprice: '11.2',\r\n\t\t\t\t\t\t\t\tquantity: '1000'\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\ttype: 'sell',\r\n\t\t\t\t\t\t\t\ttypeText: '卖出',\r\n\t\t\t\t\t\t\t\tprice: '11.7',\r\n\t\t\t\t\t\t\t\tquantity: '1000'\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t],\r\n\t\t\t\t\t\treasons: [\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tcontent: '基建板块有回暖迹象,估值处于低位',\r\n\t\t\t\t\t\t\t\tdate: '2024-01-15'\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tcontent: '一带一路政策持续推进,海外业务增长潜力大',\r\n\t\t\t\t\t\t\t\tdate: '2024-01-14'\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t],\r\n\t\t\t\t\t\tanalyses: [\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tcontent: '买入时机适中,但是仓位控制不够理想,应该分批买入',\r\n\t\t\t\t\t\t\t\tdate: '2024-01-15'\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tcontent: '整体操作策略正确,但可以更加耐心等待更好的入场时机',\r\n\t\t\t\t\t\t\t\tdate: '2024-01-15'\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t]\r\n\t\t\t\t\t}\r\n\t\t\t\t]\r\n\t\t\t}\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\tpositionLevelClass() {\r\n\t\t\t\tconst percentage = parseFloat(this.calculatedPositionPercentage) || 0\r\n\t\t\t\tif (percentage <= 50) {\r\n\t\t\t\t\treturn 'position-safe' // 绿色文字\r\n\t\t\t\t} else if (percentage <= 80) {\r\n\t\t\t\t\treturn 'position-medium' // 橙色文字\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn 'position-high' // 红色文字\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tprogressStyle() {\r\n\t\t\t\tconst percentage = parseFloat(this.calculatedPositionPercentage) || 0\r\n\t\t\t\tlet background = ''\r\n\t\t\t\t\r\n\t\t\t\tif (percentage <= 50) {\r\n\t\t\t\t\t// 50%以内全部显示绿色\r\n\t\t\t\t\tconst degree = percentage * 3.6\r\n\t\t\t\t\tbackground = `conic-gradient(#00d4aa 0deg ${degree}deg, #e6f7ff ${degree}deg 360deg)`\r\n\t\t\t\t} else if (percentage <= 80) {\r\n\t\t\t\t\t// 50%-80%:前50%绿色,超出部分橙色\r\n\t\t\t\t\tconst greenDegree = 50 * 3.6 // 180度\r\n\t\t\t\t\tconst orangeDegree = percentage * 3.6\r\n\t\t\t\t\tbackground = `conic-gradient(\r\n\t\t\t\t\t\t#00d4aa 0deg ${greenDegree}deg, \r\n\t\t\t\t\t\t#ffa502 ${greenDegree}deg ${orangeDegree}deg, \r\n\t\t\t\t\t\t#e6f7ff ${orangeDegree}deg 360deg\r\n\t\t\t\t\t)`\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// 80%以上:前50%绿色,50%-80%橙色,超出部分红色\r\n\t\t\t\t\tconst greenDegree = 50 * 3.6 // 180度\r\n\t\t\t\t\tconst orangeDegree = 80 * 3.6 // 288度\r\n\t\t\t\t\tconst redDegree = percentage * 3.6\r\n\t\t\t\t\tbackground = `conic-gradient(\r\n\t\t\t\t\t\t#00d4aa 0deg ${greenDegree}deg, \r\n\t\t\t\t\t\t#ffa502 ${greenDegree}deg ${orangeDegree}deg, \r\n\t\t\t\t\t\t#ff4757 ${orangeDegree}deg ${redDegree}deg, \r\n\t\t\t\t\t\t#e6f7ff ${redDegree}deg 360deg\r\n\t\t\t\t\t)`\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\treturn { background }\r\n\t\t\t},\r\n\t\t\tshowSubmitButton() {\r\n\t\t\t\treturn this.currentDate === this.latestTradingDate && this.hasModifications\r\n\t\t\t},\r\n\t\t\t// 计算仓位百分比\r\n\t\t\tcalculatedPositionPercentage() {\r\n\t\t\t\ttry {\r\n\t\t\t\t\t// 解析账户余额\r\n\t\t\t\t\tconst accountBalanceNum = parseFloat(this.accountBalance.replace(/[¥,]/g, ''));\r\n\t\t\t\t\t\r\n\t\t\t\t\t// 计算总持仓金额\r\n\t\t\t\t\tconst totalHoldingAmount = this.holdings.reduce((sum, holding) => {\r\n\t\t\t\t\t\tconst amount = parseFloat(holding.amount.replace(/[¥,]/g, '')) || 0;\r\n\t\t\t\t\t\treturn sum + amount;\r\n\t\t\t\t\t}, 0);\r\n\t\t\t\t\t\r\n\t\t\t\t\t// 调试信息\r\n\t\t\t\t\tconsole.log('=== 持仓仓位计算 ===');\r\n\t\t\t\t\tconsole.log('账户余额字符串:', this.accountBalance);\r\n\t\t\t\t\tconsole.log('账户余额数字:', accountBalanceNum);\r\n\t\t\t\t\tconsole.log('持仓明细:', this.holdings.map(h => ({ name: h.name, amount: h.amount, parsed: parseFloat(h.amount.replace(/[¥,]/g, '')) })));\r\n\t\t\t\t\tconsole.log('总持仓金额:', totalHoldingAmount);\r\n\t\t\t\t\t\r\n\t\t\t\t\t// 如果账户余额为0或总持仓金额为0,则返回0\r\n\t\t\t\t\tif (accountBalanceNum === 0 || totalHoldingAmount === 0) {\r\n\t\t\t\t\t\tconsole.log('返回0 - 账户余额或持仓金额为0');\r\n\t\t\t\t\t\treturn '0.0';\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\t// 持仓仓位 = 总持仓金额 ÷ 账户余额\r\n\t\t\t\t\tconst percentage = (totalHoldingAmount / accountBalanceNum) * 100;\r\n\t\t\t\t\tconst result = Math.min(100, Math.max(0, percentage)).toFixed(1);\r\n\t\t\t\t\tconsole.log('计算结果:', percentage, '最终结果:', result);\r\n\t\t\t\t\treturn result;\r\n\t\t\t\t} catch (error) {\r\n\t\t\t\t\tconsole.error('计算仓位百分比错误:', error);\r\n\t\t\t\t\treturn '0.0';\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 计算盈亏比例\r\n\t\t\tcalculatedProfitRatio() {\r\n\t\t\t\ttry {\r\n\t\t\t\t\t// 解析账户余额\r\n\t\t\t\t\tconst accountBalanceNum = parseFloat(this.accountBalance.replace(/[¥,]/g, '')) || 0;\r\n\t\t\t\t\t\r\n\t\t\t\t\t// 解析今日盈亏\r\n\t\t\t\t\tconst todayProfitNum = parseFloat(this.todayProfit.replace(/[+¥,]/g, '')) || 0;\r\n\t\t\t\t\t\r\n\t\t\t\t\t// 计算投入本金 = 账户余额 - 今日盈亏\r\n\t\t\t\t\tconst principalAmount = accountBalanceNum - todayProfitNum;\r\n\t\t\t\t\t\r\n\t\t\t\t\t// 调试信息\r\n\t\t\t\t\tconsole.log('=== 盈亏比例计算 ===');\r\n\t\t\t\t\tconsole.log('账户余额:', accountBalanceNum);\r\n\t\t\t\t\tconsole.log('今日盈亏:', todayProfitNum);\r\n\t\t\t\t\tconsole.log('投入本金:', principalAmount);\r\n\t\t\t\t\t\r\n\t\t\t\t\t// 如果账户余额为0或投入本金为0,则返回0\r\n\t\t\t\t\tif (accountBalanceNum === 0 || principalAmount === 0) {\r\n\t\t\t\t\t\tconsole.log('返回0 - 账户余额或投入本金为0');\r\n\t\t\t\t\t\treturn '0.00';\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\t// 盈亏比例 = 今日盈亏 ÷ 投入本金\r\n\t\t\t\t\tconst percentage = (todayProfitNum / principalAmount) * 100;\r\n\t\t\t\t\tconst result = (percentage >= 0 ? '+' : '') + percentage.toFixed(2);\r\n\t\t\t\t\tconsole.log('计算结果:', percentage, '最终结果:', result);\r\n\t\t\t\t\treturn result;\r\n\t\t\t\t} catch (error) {\r\n\t\t\t\t\tconsole.error('计算盈亏比例错误:', error);\r\n\t\t\t\t\treturn '0.00';\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\tonLoad() {\r\n\t\t\tthis.initDate()\r\n\t\t},\r\n\t\tonShow() {\r\n\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\tinitDate() {\r\n\t\t\t\tconst now = new Date()\r\n\t\t\t\tconst year = now.getFullYear()\r\n\t\t\t\tconst month = (now.getMonth() + 1).toString().padStart(2, '0')\r\n\t\t\t\tconst day = now.getDate().toString().padStart(2, '0')\r\n\t\t\t\t\r\n\t\t\t\tthis.currentDate = `${year}-${month}-${day}`\r\n\t\t\t\tthis.latestTradingDate = this.currentDate // 设置最新交易日为当前日期\r\n\t\t\t\tthis.selectedDate = now\r\n\t\t\t\tthis.updateDateText(this.currentDate)\r\n\t\t\t\tthis.generateCalendar()\r\n\t\t\t},\r\n\t\t\tupdateDateText(dateStr) {\r\n\t\t\t\tconst date = new Date(dateStr)\r\n\t\t\t\tconst year = date.getFullYear()\r\n\t\t\t\tconst month = date.getMonth() + 1\r\n\t\t\t\tconst day = date.getDate()\r\n\t\t\t\tconst weekDays = ['日', '一', '二', '三', '四', '五', '六']\r\n\t\t\t\tconst weekDay = weekDays[date.getDay()]\r\n\t\t\t\t\r\n\t\t\t\tthis.currentDateText = `${year}年${month}月${day}日 星期${weekDay}`\r\n\t\t\t},\r\n\t\t\tshowCalendar() {\r\n\t\t\t\tthis.showCalendarPicker = true\r\n\t\t\t\tthis.generateCalendar()\r\n\t\t\t},\r\n\t\t\thideCalendar() {\r\n\t\t\t\tthis.showCalendarPicker = false\r\n\t\t\t},\r\n\t\t\tgenerateCalendar() {\r\n\t\t\t\tconst year = this.calendarYear\r\n\t\t\t\tconst month = this.calendarMonth - 1 // JavaScript月份从0开始\r\n\t\t\t\t\r\n\t\t\t\t// 当月第一天\r\n\t\t\t\tconst firstDay = new Date(year, month, 1)\r\n\t\t\t\t// 当月最后一天\r\n\t\t\t\tconst lastDay = new Date(year, month + 1, 0)\r\n\t\t\t\t// 第一天是星期几 (0=周日, 1=周一...)\r\n\t\t\t\tlet firstDayWeek = firstDay.getDay()\r\n\t\t\t\t// 转换为周一开始 (0=周一, 6=周日)\r\n\t\t\t\tfirstDayWeek = firstDayWeek === 0 ? 6 : firstDayWeek - 1\r\n\t\t\t\t\r\n\t\t\t\t// 生成日历数组\r\n\t\t\t\tconst weeks = []\r\n\t\t\t\tlet week = []\r\n\t\t\t\t\r\n\t\t\t\t// 添加上月末尾日期\r\n\t\t\t\tconst prevMonth = month === 0 ? 11 : month - 1\r\n\t\t\t\tconst prevYear = month === 0 ? year - 1 : year\r\n\t\t\t\tconst prevLastDay = new Date(prevYear, prevMonth + 1, 0).getDate()\r\n\t\t\t\t\r\n\t\t\t\tfor (let i = firstDayWeek - 1; i >= 0; i--) {\r\n\t\t\t\t\tweek.push({\r\n\t\t\t\t\t\tday: prevLastDay - i,\r\n\t\t\t\t\t\tisCurrentMonth: false,\r\n\t\t\t\t\t\tisSelected: false,\r\n\t\t\t\t\t\tisToday: false,\r\n\t\t\t\t\t\tdate: new Date(prevYear, prevMonth, prevLastDay - i)\r\n\t\t\t\t\t})\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t// 添加当月日期\r\n\t\t\t\tconst today = new Date()\r\n\t\t\t\tfor (let day = 1; day <= lastDay.getDate(); day++) {\r\n\t\t\t\t\tconst currentDate = new Date(year, month, day)\r\n\t\t\t\t\tconst isToday = today.getFullYear() === year && \r\n\t\t\t\t\t\t\t\t\ttoday.getMonth() === month && \r\n\t\t\t\t\t\t\t\t\ttoday.getDate() === day\r\n\t\t\t\t\tconst isSelected = this.selectedDate && \r\n\t\t\t\t\t\t\t\t\t this.selectedDate.getFullYear() === year &&\r\n\t\t\t\t\t\t\t\t\t this.selectedDate.getMonth() === month &&\r\n\t\t\t\t\t\t\t\t\t this.selectedDate.getDate() === day\r\n\t\t\t\t\t\r\n\t\t\t\t\tweek.push({\r\n\t\t\t\t\t\tday: day,\r\n\t\t\t\t\t\tisCurrentMonth: true,\r\n\t\t\t\t\t\tisSelected: isSelected,\r\n\t\t\t\t\t\tisToday: isToday,\r\n\t\t\t\t\t\tdate: currentDate\r\n\t\t\t\t\t})\r\n\t\t\t\t\t\r\n\t\t\t\t\tif (week.length === 7) {\r\n\t\t\t\t\t\tweeks.push(week)\r\n\t\t\t\t\t\tweek = []\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t// 添加下月开头日期\r\n\t\t\t\tconst nextMonth = month === 11 ? 0 : month + 1\r\n\t\t\t\tconst nextYear = month === 11 ? year + 1 : year\r\n\t\t\t\tlet nextDay = 1\r\n\t\t\t\twhile (week.length < 7) {\r\n\t\t\t\t\tweek.push({\r\n\t\t\t\t\t\tday: nextDay,\r\n\t\t\t\t\t\tisCurrentMonth: false,\r\n\t\t\t\t\t\tisSelected: false,\r\n\t\t\t\t\t\tisToday: false,\r\n\t\t\t\t\t\tdate: new Date(nextYear, nextMonth, nextDay)\r\n\t\t\t\t\t})\r\n\t\t\t\t\tnextDay++\r\n\t\t\t\t}\r\n\t\t\t\tweeks.push(week)\r\n\t\t\t\t\r\n\t\t\t\tthis.calendarWeeks = weeks\r\n\t\t\t},\r\n\t\t\tprevMonth() {\r\n\t\t\t\tif (this.calendarMonth === 1) {\r\n\t\t\t\t\tthis.calendarMonth = 12\r\n\t\t\t\t\tthis.calendarYear--\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.calendarMonth--\r\n\t\t\t\t}\r\n\t\t\t\tthis.generateCalendar()\r\n\t\t\t},\r\n\t\t\tnextMonth() {\r\n\t\t\t\tif (this.calendarMonth === 12) {\r\n\t\t\t\t\tthis.calendarMonth = 1\r\n\t\t\t\t\tthis.calendarYear++\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.calendarMonth++\r\n\t\t\t\t}\r\n\t\t\t\tthis.generateCalendar()\r\n\t\t\t},\r\n\t\t\tselectDate(day) {\r\n\t\t\t\tif (!day.isCurrentMonth) return\r\n\t\t\t\t\r\n\t\t\t\tthis.selectedDate = day.date\r\n\t\t\t\tconst year = day.date.getFullYear()\r\n\t\t\t\tconst month = (day.date.getMonth() + 1).toString().padStart(2, '0')\r\n\t\t\t\tconst dayNum = day.date.getDate().toString().padStart(2, '0')\r\n\t\t\t\t\r\n\t\t\t\tthis.currentDate = `${year}-${month}-${dayNum}`\r\n\t\t\t\tthis.updateDateText(this.currentDate)\r\n\t\t\t\tthis.generateCalendar() // 重新生成以更新选中状态\r\n\t\t\t\tthis.hideCalendar()\r\n\t\t\t\tthis.loadDateData(this.currentDate)\r\n\t\t\t},\r\n\t\t\tloadDateData(date) {\r\n\t\t\t\t// 根据选择的日期加载数据\r\n\t\t\t\tconsole.log('加载日期数据:', date)\r\n\t\t\t\t\r\n\t\t\t\t// 重置修改状态\r\n\t\t\t\tthis.resetModifications()\r\n\t\t\t\t\r\n\t\t\t\t// 这里可以调用API获取指定日期的数据\r\n\t\t\t\tuni.showToast({\r\n\t\t\t\t\ttitle: `已切换到${date}`,\r\n\t\t\t\t\ticon: 'none',\r\n\t\t\t\t\tduration: 1500\r\n\t\t\t\t})\r\n\t\t\t},\r\n\t\t\taddRecord() {\r\n\t\t\t\tuni.showToast({\r\n\t\t\t\t\ttitle: '添加记录',\r\n\t\t\t\t\ticon: 'none'\r\n\t\t\t\t})\r\n\t\t\t},\r\n\t\t\t// 测试方法:用于测试不同仓位的显示效果\r\n\t\t\ttestPosition() {\r\n\t\t\t\t// 循环测试不同的仓位百分比\r\n\t\t\t\tconst testValues = [30, 65, 90]\r\n\t\t\t\tconst currentIndex = testValues.findIndex(val => val === this.positionPercentage)\r\n\t\t\t\tconst nextIndex = (currentIndex + 1) % testValues.length\r\n\t\t\t\tthis.positionPercentage = testValues[nextIndex]\r\n\t\t\t\t\r\n\t\t\t\t// 标记有修改\r\n\t\t\t\tthis.markAsModified()\r\n\t\t\t\t\r\n\t\t\t\tuni.showToast({\r\n\t\t\t\t\ttitle: `切换到${this.positionPercentage}%仓位`,\r\n\t\t\t\t\ticon: 'none'\r\n\t\t\t\t})\r\n\t\t\t},\r\n\t\t\t// 标记数据已修改\r\n\t\t\tmarkAsModified() {\r\n\t\t\t\tif (this.currentDate === this.latestTradingDate) {\r\n\t\t\t\t\tthis.hasModifications = true\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 提交修改\r\n\t\t\tsubmitChanges() {\r\n\t\t\t\tuni.showModal({\r\n\t\t\t\t\ttitle: '确认提交',\r\n\t\t\t\t\tcontent: '确定要提交当前的修改吗?',\r\n\t\t\t\t\tsuccess: (res) => {\r\n\t\t\t\t\t\tif (res.confirm) {\r\n\t\t\t\t\t\t\t// 这里调用API提交修改\r\n\t\t\t\t\t\t\tconsole.log('提交修改到服务器')\r\n\t\t\t\t\t\t\tthis.hasModifications = false\r\n\t\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\t\ttitle: '修改已提交',\r\n\t\t\t\t\t\t\t\ticon: 'success'\r\n\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t},\r\n\t\t\t// 重置修改状态\r\n\t\t\tresetModifications() {\r\n\t\t\t\tthis.hasModifications = false\r\n\t\t\t},\r\n\t\t\t// 切换编辑模式\r\n\t\t\ttoggleEditMode() {\r\n\t\t\t\tif (!this.isEditMode) {\r\n\t\t\t\t\t// 进入编辑模式时,检查是否为最新交易日\r\n\t\t\t\t\tif (this.currentDate !== this.latestTradingDate) {\r\n\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\ttitle: '只能编辑最新交易日的数据',\r\n\t\t\t\t\t\t\ticon: 'none',\r\n\t\t\t\t\t\t\tduration: 2000\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t\treturn\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\t// 将当前数据复制到编辑数据\r\n\t\t\t\t\tthis.editData = {\r\n\t\t\t\t\t\taccountBalance: this.accountBalance,\r\n\t\t\t\t\t\ttodayProfit: this.todayProfit,\r\n\t\t\t\t\t\tholdings: this.holdings.map(holding => ({\r\n\t\t\t\t\t\t\tname: holding.name,\r\n\t\t\t\t\t\t\tstockCode: holding.stockCode,\r\n\t\t\t\t\t\t\tamount: holding.amount,\r\n\t\t\t\t\t\t\tprofitLoss: holding.profitLoss,\r\n\t\t\t\t\t\t\tprice: holding.price,\r\n\t\t\t\t\t\t\tchange: holding.change,\r\n\t\t\t\t\t\t\tisNameLocked: holding.isNameLocked\r\n\t\t\t\t\t\t}))\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthis.isEditMode = true\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// 退出编辑模式,不保存\r\n\t\t\t\t\tthis.isEditMode = false\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 编辑持仓金额或盈亏金额\r\n\t\t\teditHoldingAmount(index, field) {\r\n\t\t\t\t// 确保最新交易日已设置\r\n\t\t\t\tif (!this.latestTradingDate) {\r\n\t\t\t\t\tconst now = new Date()\r\n\t\t\t\t\tconst year = now.getFullYear()\r\n\t\t\t\t\tconst month = (now.getMonth() + 1).toString().padStart(2, '0')\r\n\t\t\t\t\tconst day = now.getDate().toString().padStart(2, '0')\r\n\t\t\t\t\tthis.latestTradingDate = `${year}-${month}-${day}`\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t// 只有当前是最新交易日才允许编辑\r\n\t\t\t\tif (this.currentDate !== this.latestTradingDate) {\r\n\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\ttitle: '只能编辑最新交易日的数据',\r\n\t\t\t\t\t\ticon: 'none',\r\n\t\t\t\t\t\tduration: 2000\r\n\t\t\t\t\t})\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tconst holding = this.holdings[index]\r\n\t\t\t\tconst currentValue = holding[field]\r\n\t\t\t\tconst fieldName = field === 'amount' ? '持仓金额' : '盈亏金额'\r\n\t\t\t\t\r\n\t\t\t\tuni.showModal({\r\n\t\t\t\t\ttitle: '编辑' + fieldName,\r\n\t\t\t\t\tcontent: `请输入新的${fieldName}(当前: ${currentValue})`,\r\n\t\t\t\t\teditable: true,\r\n\t\t\t\t\tplaceholderText: currentValue,\r\n\t\t\t\t\tsuccess: (res) => {\r\n\t\t\t\t\t\tif (res.confirm && res.content) {\r\n\t\t\t\t\t\t\tconst newValue = res.content.trim()\r\n\t\t\t\t\t\t\tif (newValue !== currentValue) {\r\n\t\t\t\t\t\t\t\tthis.holdings[index][field] = newValue\r\n\t\t\t\t\t\t\t\tthis.markAsModified()\r\n\t\t\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\t\t\ttitle: fieldName + '已更新',\r\n\t\t\t\t\t\t\t\t\ticon: 'success'\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t},\r\n\t\t\t// 编辑账户余额\r\n\t\t\teditAccountBalance() {\r\n\t\t\t\t// 确保是最新交易日才允许编辑\r\n\t\t\t\tif (this.currentDate !== this.latestTradingDate) {\r\n\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\ttitle: '只能编辑最新交易日的数据',\r\n\t\t\t\t\t\ticon: 'none',\r\n\t\t\t\t\t\tduration: 2000\r\n\t\t\t\t\t})\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tuni.showModal({\r\n\t\t\t\t\ttitle: '编辑账户余额',\r\n\t\t\t\t\tcontent: `请输入新的账户余额(当前: ¥${this.accountBalance})`,\r\n\t\t\t\t\teditable: true,\r\n\t\t\t\t\tplaceholderText: this.accountBalance,\r\n\t\t\t\t\tsuccess: (res) => {\r\n\t\t\t\t\t\tif (res.confirm && res.content) {\r\n\t\t\t\t\t\t\tconst newValue = res.content.trim()\r\n\t\t\t\t\t\t\tif (newValue !== this.accountBalance) {\r\n\t\t\t\t\t\t\t\tthis.accountBalance = newValue\r\n\t\t\t\t\t\t\t\tthis.markAsModified()\r\n\t\t\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\t\t\ttitle: '账户余额已更新',\r\n\t\t\t\t\t\t\t\t\ticon: 'success'\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t},\r\n\t\t\t\r\n\t\t\t// 编辑今日盈亏\r\n\t\t\teditTodayProfit() {\r\n\t\t\t\t// 确保是最新交易日才允许编辑\r\n\t\t\t\tif (this.currentDate !== this.latestTradingDate) {\r\n\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\ttitle: '只能编辑最新交易日的数据',\r\n\t\t\t\t\t\ticon: 'none',\r\n\t\t\t\t\t\tduration: 2000\r\n\t\t\t\t\t})\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tuni.showModal({\r\n\t\t\t\t\ttitle: '编辑今日盈亏',\r\n\t\t\t\t\tcontent: `请输入今日盈亏(当前: ${this.todayProfit})`,\r\n\t\t\t\t\teditable: true,\r\n\t\t\t\t\tplaceholderText: this.todayProfit,\r\n\t\t\t\t\tsuccess: (res) => {\r\n\t\t\t\t\t\tif (res.confirm && res.content) {\r\n\t\t\t\t\t\t\tconst newValue = res.content.trim()\r\n\t\t\t\t\t\t\tif (newValue !== this.todayProfit) {\r\n\t\t\t\t\t\t\t\tthis.todayProfit = newValue\r\n\t\t\t\t\t\t\t\tthis.markAsModified()\r\n\t\t\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\t\t\ttitle: '今日盈亏已更新',\r\n\t\t\t\t\t\t\t\t\ticon: 'success'\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t},\r\n\t\t\tcancelEdit() {\r\n\t\t\t\t// 取消编辑,不保存任何更改\r\n\t\t\t\tthis.isEditMode = false\r\n\t\t\t},\r\n\t\t\tsubmitEdit() {\r\n\t\t\t\t// 保存编辑的数据\r\n\t\t\t\tthis.accountBalance = this.editData.accountBalance\r\n\t\t\t\tthis.todayProfit = this.editData.todayProfit\r\n\t\t\t\t\r\n\t\t\t\t// 更新持仓数据\r\n\t\t\t\tfor (let i = 0; i < this.holdings.length; i++) {\r\n\t\t\t\t\tif (this.editData.holdings[i]) {\r\n\t\t\t\t\t\tthis.holdings[i].name = this.editData.holdings[i].name\r\n\t\t\t\t\t\tthis.holdings[i].stockCode = this.editData.holdings[i].stockCode\r\n\t\t\t\t\t\tthis.holdings[i].amount = this.editData.holdings[i].amount\r\n\t\t\t\t\t\tthis.holdings[i].profitLoss = this.editData.holdings[i].profitLoss\r\n\t\t\t\t\t\tthis.holdings[i].price = this.editData.holdings[i].price\r\n\t\t\t\t\t\tthis.holdings[i].change = this.editData.holdings[i].change\r\n\t\t\t\t\t\tthis.holdings[i].isNameLocked = this.editData.holdings[i].isNameLocked\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t// 根据涨跌幅更新样式类\r\n\t\t\t\t\t\tthis.holdings[i].changeClass = this.editData.holdings[i].change.startsWith('+') ? 'positive' : 'negative'\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t// 过滤掉已删除的持仓\r\n\t\t\t\tthis.holdings = this.holdings.filter(holding => !holding.isDeleted)\r\n\t\t\t\t\r\n\t\t\t\tthis.isEditMode = false\r\n\t\t\t\tthis.markAsModified()\r\n\t\t\t\t\r\n\t\t\t\tuni.showToast({\r\n\t\t\t\t\ttitle: '保存成功',\r\n\t\t\t\t\ticon: 'success'\r\n\t\t\t\t})\r\n\t\t\t},\r\n\t\t\taddHolding() {\r\n\t\t\t\t// 显示股票搜索弹窗\r\n\t\t\t\tthis.showStockSearchModal()\r\n\t\t\t},\r\n\t\t\t\r\n\t\t\tshowStockSearchModal() {\r\n\t\t\t\tuni.showModal({\r\n\t\t\t\t\ttitle: '添加持仓',\r\n\t\t\t\t\tcontent: '请输入股票名称或代码',\r\n\t\t\t\t\teditable: true,\r\n\t\t\t\t\tplaceholderText: '例如:北方稀土、600111',\r\n\t\t\t\t\tsuccess: (res) => {\r\n\t\t\t\t\t\tif (res.confirm && res.content) {\r\n\t\t\t\t\t\t\tconst searchText = res.content.trim()\r\n\t\t\t\t\t\t\tif (searchText) {\r\n\t\t\t\t\t\t\t\tthis.searchStocks(searchText)\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t},\r\n\t\t\t\r\n\t\t\tsearchStocks(searchText) {\r\n\t\t\t\t// 模拟股票搜索数据\r\n\t\t\t\tconst stockDatabase = [\r\n\t\t\t\t\t{ code: '600111', name: '北方稀土', fullName: '北方稀土(600111)' },\r\n\t\t\t\t\t{ code: '601669', name: '中国电建', fullName: '中国电建(601669)' },\r\n\t\t\t\t\t{ code: '000001', name: '平安银行', fullName: '平安银行(000001)' },\r\n\t\t\t\t\t{ code: '000002', name: '万科A', fullName: '万科A(000002)' },\r\n\t\t\t\t\t{ code: '000858', name: '五粮液', fullName: '五粮液(000858)' },\r\n\t\t\t\t\t{ code: '600036', name: '招商银行', fullName: '招商银行(600036)' },\r\n\t\t\t\t\t{ code: '600519', name: '贵州茅台', fullName: '贵州茅台(600519)' },\r\n\t\t\t\t\t{ code: '600887', name: '伊利股份', fullName: '伊利股份(600887)' },\r\n\t\t\t\t\t{ code: '000676', name: '智度股份', fullName: '智度股份(000676)' }\r\n\t\t\t\t]\r\n\t\t\t\t\r\n\t\t\t\t// 模糊搜索匹配\r\n\t\t\t\tconst results = stockDatabase.filter(stock => \r\n\t\t\t\t\tstock.name.includes(searchText) || \r\n\t\t\t\t\tstock.code.includes(searchText) ||\r\n\t\t\t\t\tstock.fullName.includes(searchText)\r\n\t\t\t\t)\r\n\t\t\t\t\r\n\t\t\t\tif (results.length === 0) {\r\n\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\ttitle: '未找到相关股票',\r\n\t\t\t\t\t\ticon: 'none'\r\n\t\t\t\t\t})\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tif (results.length === 1) {\r\n\t\t\t\t\t// 只有一个结果,直接选择\r\n\t\t\t\t\tthis.confirmAddStock(results[0])\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// 多个结果,显示选择列表\r\n\t\t\t\t\tthis.showStockSelectModal(results)\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t\r\n\t\t\tshowStockSelectModal(stocks) {\r\n\t\t\t\tconst itemList = stocks.map(stock => stock.fullName)\r\n\t\t\t\t\r\n\t\t\t\tuni.showActionSheet({\r\n\t\t\t\t\titemList: itemList,\r\n\t\t\t\t\tsuccess: (res) => {\r\n\t\t\t\t\t\tconst selectedStock = stocks[res.tapIndex]\r\n\t\t\t\t\t\tthis.confirmAddStock(selectedStock)\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t},\r\n\t\t\t\r\n\t\t\tconfirmAddStock(stock) {\r\n\t\t\t\t// 检查是否已存在该股票\r\n\t\t\t\tconst existingIndex = this.holdings.findIndex(holding => \r\n\t\t\t\t\tholding.name === stock.name || holding.stockCode === stock.code\r\n\t\t\t\t)\r\n\t\t\t\t\r\n\t\t\t\tif (existingIndex >= 0) {\r\n\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\ttitle: '该股票已存在',\r\n\t\t\t\t\t\ticon: 'none'\r\n\t\t\t\t\t})\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t// 新增持仓数据\r\n\t\t\t\tconst newHolding = {\r\n\t\t\t\t\tname: stock.name,\r\n\t\t\t\t\tstockCode: stock.code,\r\n\t\t\t\t\tchange: '+0.00%',\r\n\t\t\t\t\tchangeClass: 'positive',\r\n\t\t\t\t\tamount: '0',\r\n\t\t\t\t\tposition: '0%',\r\n\t\t\t\t\tposition2: '0%',\r\n\t\t\t\t\tprice: '0.00',\r\n\t\t\t\t\tprofitLoss: '+0',\r\n\t\t\t\t\tisDeleted: false,\r\n\t\t\t\t\tisNameLocked: true // 标记名称已锁定,不可修改\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tthis.holdings.push(newHolding)\r\n\t\t\t\t\r\n\t\t\t\t// 同步更新editData\r\n\t\t\t\tif (this.isEditMode) {\r\n\t\t\t\t\tthis.editData.holdings.push({\r\n\t\t\t\t\t\tname: newHolding.name,\r\n\t\t\t\t\t\tstockCode: newHolding.stockCode,\r\n\t\t\t\t\t\tamount: newHolding.amount,\r\n\t\t\t\t\t\tprofitLoss: newHolding.profitLoss,\r\n\t\t\t\t\t\tprice: newHolding.price,\r\n\t\t\t\t\t\tchange: newHolding.change,\r\n\t\t\t\t\t\tisNameLocked: true\r\n\t\t\t\t\t})\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tthis.markAsModified()\r\n\t\t\t\tuni.showToast({\r\n\t\t\t\t\ttitle: `添加${stock.name}成功`,\r\n\t\t\t\t\ticon: 'success'\r\n\t\t\t\t})\r\n\t\t\t},\r\n\t\t\ttoggleDeleteHolding(index) {\r\n\t\t\t\tthis.holdings[index].isDeleted = !this.holdings[index].isDeleted\r\n\t\t\t\tthis.markAsModified()\r\n\t\t\t\tuni.showToast({\r\n\t\t\t\t\ttitle: this.holdings[index].isDeleted ? '删除持仓成功' : '恢复持仓成功',\r\n\t\t\t\t\ticon: 'success'\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style scoped>\r\n\t.container {\r\n\t\tmin-height: 100vh;\r\n\t\tbackground: #f5f7fa;\r\n\t\tpadding-bottom: 120rpx;\r\n\t}\r\n\r\n\t/* 日期选择器 */\r\n\t.date-header {\r\n\t\tbackground: white;\r\n\t\tpadding: 20rpx 30rpx;\r\n\t\tborder-bottom: 1rpx solid #f0f0f0;\r\n\t\tposition: sticky;\r\n\t\ttop: 0;\r\n\t\tz-index: 99;\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: space-between;\r\n\t\talign-items: center;\r\n\t}\r\n\r\n\t.date-selector {\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tpadding: 15rpx 0;\r\n\t}\r\n\t\r\n\t.edit-toggle {\r\n\t\tpadding: 15rpx 25rpx;\r\n\t\tbackground: #007aff;\r\n\t\tborder-radius: 25rpx;\r\n\t\tcursor: pointer;\r\n\t\ttransition: background-color 0.2s;\r\n\t}\r\n\t\r\n\t.edit-toggle:hover {\r\n\t\tbackground: #0056b3;\r\n\t}\r\n\t\r\n\t.edit-toggle-text {\r\n\t\tcolor: white;\r\n\t\tfont-size: 28rpx;\r\n\t\tfont-weight: 500;\r\n\t}\r\n\r\n\t.date-text {\r\n\t\tcolor: #333;\r\n\t\tfont-size: 32rpx;\r\n\t\tfont-weight: bold;\r\n\t\tmargin-right: 15rpx;\r\n\t}\r\n\r\n\t.calendar-icon {\r\n\t\tfont-size: 28rpx;\r\n\t\tcolor: #007aff;\r\n\t}\r\n\r\n\t/* 自定义日历 */\r\n\t.calendar-overlay {\r\n\t\tposition: fixed;\r\n\t\ttop: 0;\r\n\t\tleft: 0;\r\n\t\twidth: 100%;\r\n\t\theight: 100%;\r\n\t\tbackground: rgba(0, 0, 0, 0.5);\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t\tz-index: 1000;\r\n\t}\r\n\r\n\t.calendar-popup {\r\n\t\tbackground: white;\r\n\t\twidth: 90%;\r\n\t\tmax-width: 600rpx;\r\n\t\tborder-radius: 20rpx;\r\n\t\tpadding: 30rpx;\r\n\t\tbox-shadow: 0 10rpx 30rpx rgba(0, 0, 0, 0.3);\r\n\t}\r\n\r\n\t.calendar-header {\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: space-between;\r\n\t\talign-items: center;\r\n\t\tmargin-bottom: 30rpx;\r\n\t\tpadding-bottom: 20rpx;\r\n\t\tborder-bottom: 1rpx solid #f0f0f0;\r\n\t}\r\n\r\n\t.calendar-title {\r\n\t\tfont-size: 36rpx;\r\n\t\tfont-weight: bold;\r\n\t\tcolor: #333;\r\n\t}\r\n\r\n\t.calendar-nav {\r\n\t\tdisplay: flex;\r\n\t\tgap: 30rpx;\r\n\t}\r\n\r\n\t.nav-btn {\r\n\t\twidth: 60rpx;\r\n\t\theight: 60rpx;\r\n\t\tbackground: #f5f5f5;\r\n\t\tborder-radius: 50%;\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t\tfont-size: 24rpx;\r\n\t\tcolor: #666;\r\n\t}\r\n\r\n\t.calendar-weekdays {\r\n\t\tdisplay: grid;\r\n\t\tgrid-template-columns: repeat(7, 1fr);\r\n\t\tgap: 10rpx;\r\n\t\tmargin-bottom: 20rpx;\r\n\t}\r\n\r\n\t.weekday {\r\n\t\ttext-align: center;\r\n\t\tcolor: #999;\r\n\t\tfont-size: 24rpx;\r\n\t\tpadding: 15rpx 0;\r\n\t}\r\n\r\n\t.calendar-days {\r\n\t\tdisplay: flex;\r\n\t\tflex-direction: column;\r\n\t\tgap: 5rpx;\r\n\t}\r\n\r\n\t.calendar-row {\r\n\t\tdisplay: grid;\r\n\t\tgrid-template-columns: repeat(7, 1fr);\r\n\t\tgap: 5rpx;\r\n\t}\r\n\r\n\t.calendar-day {\r\n\t\taspect-ratio: 1;\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t\tborder-radius: 8rpx;\r\n\t\tcursor: pointer;\r\n\t\ttransition: all 0.2s;\r\n\t}\r\n\r\n\t.calendar-day.other-month {\r\n\t\topacity: 0.3;\r\n\t}\r\n\r\n\t.calendar-day.selected {\r\n\t\tbackground: #007aff;\r\n\t\tcolor: white;\r\n\t}\r\n\r\n\t.calendar-day.today {\r\n\t\tbackground: #e8f4ff;\r\n\t\tcolor: #007aff;\r\n\t\tfont-weight: bold;\r\n\t}\r\n\r\n\t.calendar-day.selected.today {\r\n\t\tbackground: #007aff;\r\n\t\tcolor: white;\r\n\t}\r\n\r\n\t.day-number {\r\n\t\tfont-size: 28rpx;\r\n\t}\r\n\r\n\t/* 可编辑字段样式 */\r\n\t.editable-field {\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tcursor: pointer;\r\n\t\tpadding: 4rpx 8rpx;\r\n\t\tborder-radius: 6rpx;\r\n\t\ttransition: background-color 0.2s;\r\n\t\tposition: relative;\r\n\t}\r\n\r\n\t.editable-field:hover {\r\n\t\tbackground-color: rgba(0, 122, 255, 0.1);\r\n\t}\r\n\r\n\t.edit-icon {\r\n\t\tfont-size: 20rpx;\r\n\t\tmargin-left: 8rpx;\r\n\t\topacity: 0.6;\r\n\t\ttransition: opacity 0.2s;\r\n\t}\r\n\r\n\t.editable-field:hover .edit-icon {\r\n\t\topacity: 1;\r\n\t}\r\n\r\n\t/* 账户概览 */\r\n\t.account-overview {\r\n\t\tbackground: white;\r\n\t\tmargin: 20rpx;\r\n\t\tborder-radius: 16rpx;\r\n\t\tpadding: 30rpx;\r\n\t\tbox-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.1);\r\n\t}\r\n\r\n\t.balance-section {\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: space-between;\r\n\t\talign-items: center;\r\n\t\tmargin-bottom: 30rpx;\r\n\t}\r\n\r\n\t.balance-left {\r\n\t\tflex: 1;\r\n\t}\r\n\r\n\t.balance-label {\r\n\t\tdisplay: block;\r\n\t\tcolor: #666;\r\n\t\tfont-size: 28rpx;\r\n\t\tmargin-bottom: 10rpx;\r\n\t}\r\n\r\n\t.balance-amount {\r\n\t\tdisplay: block;\r\n\t\tcolor: #333;\r\n\t\tfont-size: 48rpx;\r\n\t\tfont-weight: bold;\r\n\t}\r\n\t\r\n\t.balance-input {\r\n\t\tmax-width: 300rpx;\r\n\t\tfont-size: 48rpx;\r\n\t\tfont-weight: bold;\r\n\t\tcolor: #333;\r\n\t\tborder: 2rpx solid #007aff;\r\n\t\tborder-radius: 12rpx;\r\n\t\tpadding: 15rpx 20rpx;\r\n\t\tbackground: #f8f9fa;\r\n\t\tbox-shadow: 0 2rpx 8rpx rgba(0, 122, 255, 0.1);\r\n\t}\r\n\t\r\n\t.profit-input {\r\n\t\tmax-width: 200rpx;\r\n\t\tfont-size: 28rpx;\r\n\t\tfont-weight: bold;\r\n\t\tcolor: #333;\r\n\t\tborder: 2rpx solid #007aff;\r\n\t\tborder-radius: 10rpx;\r\n\t\tpadding: 12rpx 16rpx;\r\n\t\tbackground: #f8f9fa;\r\n\t\ttext-align: center;\r\n\t\tbox-shadow: 0 2rpx 8rpx rgba(0, 122, 255, 0.1);\r\n\t}\r\n\r\n\t.profit-input-wrapper {\r\n\t\tmargin-top: 8rpx;\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: center;\r\n\t}\r\n\r\n\t.balance-right {\r\n\t\ttext-align: center;\r\n\t}\r\n\r\n\t.asset-label {\r\n\t\tdisplay: block;\r\n\t\tcolor: #666;\r\n\t\tfont-size: 24rpx;\r\n\t\tmargin-bottom: 10rpx;\r\n\t}\r\n\r\n\t.progress-circle {\r\n\t\twidth: 80rpx;\r\n\t\theight: 80rpx;\r\n\t\tborder-radius: 50%;\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t\tposition: relative;\r\n\t}\r\n\r\n\t/* 不同仓位等级的颜色 - 这些样式已由动态样式替代,可以保留作为备用 */\r\n\t.progress-circle.position-safe {\r\n\t\t/* background: conic-gradient(#00d4aa 0deg 306deg, #e6f7ff 306deg 360deg); */\r\n\t}\r\n\r\n\t.progress-circle.position-medium {\r\n\t\t/* background: conic-gradient(#ffa502 0deg 306deg, #e6f7ff 306deg 360deg); */\r\n\t}\r\n\r\n\t.progress-circle.position-high {\r\n\t\t/* background: conic-gradient(#ff4757 0deg 306deg, #e6f7ff 306deg 360deg); */\r\n\t}\r\n\r\n\t.progress-circle::after {\r\n\t\tcontent: '';\r\n\t\twidth: 60rpx;\r\n\t\theight: 60rpx;\r\n\t\tbackground: white;\r\n\t\tborder-radius: 50%;\r\n\t\tposition: absolute;\r\n\t}\r\n\r\n\t.progress-text {\r\n\t\tfont-size: 24rpx;\r\n\t\tfont-weight: bold;\r\n\t\tz-index: 1;\r\n\t}\r\n\r\n\t/* 不同仓位等级的文字颜色 */\r\n\t.position-safe .progress-text {\r\n\t\tcolor: #00d4aa;\r\n\t}\r\n\r\n\t.position-medium .progress-text {\r\n\t\tcolor: #ffa502;\r\n\t}\r\n\r\n\t.position-high .progress-text {\r\n\t\tcolor: #ff4757;\r\n\t}\r\n\r\n\t.profit-section {\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: space-between;\r\n\t}\r\n\r\n\t.profit-item {\r\n\t\ttext-align: center;\r\n\t}\r\n\r\n\t.profit-label {\r\n\t\tdisplay: block;\r\n\t\tcolor: #666;\r\n\t\tfont-size: 24rpx;\r\n\t\tmargin-bottom: 8rpx;\r\n\t}\r\n\r\n\t.profit-value {\r\n\t\tdisplay: block;\r\n\t\tfont-size: 28rpx;\r\n\t\tfont-weight: bold;\r\n\t}\r\n\r\n\t.profit-value.positive {\r\n\t\tcolor: #ff4757;\r\n\t}\r\n\r\n\t.profit-value.negative {\r\n\t\tcolor: #00d4aa;\r\n\t}\r\n\r\n\t/* 持仓 */\r\n\t.holdings-section {\r\n\t\tmargin: 20rpx;\r\n\t}\r\n\r\n\t.section-header {\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: space-between;\r\n\t\talign-items: center;\r\n\t\tmargin-bottom: 20rpx;\r\n\t}\r\n\r\n\t.section-title {\r\n\t\tdisplay: block;\r\n\t\tcolor: #333;\r\n\t\tfont-size: 32rpx;\r\n\t\tfont-weight: bold;\r\n\t}\r\n\r\n\t.add-holding-btn {\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tgap: 8rpx;\r\n\t\tpadding: 8rpx 15rpx;\r\n\t\tbackground: #007aff;\r\n\t\tborder-radius: 20rpx;\r\n\t\tcolor: white;\r\n\t\tfont-size: 24rpx;\r\n\t\tfont-weight: 500;\r\n\t\tcursor: pointer;\r\n\t\ttransition: background-color 0.2s;\r\n\t}\r\n\r\n\t.add-holding-btn:hover {\r\n\t\tbackground: #0056b3;\r\n\t}\r\n\r\n\t.add-icon {\r\n\t\tfont-size: 28rpx;\r\n\t}\r\n\r\n\t.add-text {\r\n\t\tfont-size: 28rpx;\r\n\t}\r\n\r\n\t.holdings-grid {\r\n\t\tdisplay: grid;\r\n\t\tgrid-template-columns: repeat(2, 1fr);\r\n\t\tgap: 20rpx;\r\n\t}\r\n\r\n\t.holding-card {\r\n\t\tbackground: white;\r\n\t\tborder-radius: 16rpx;\r\n\t\tpadding: 25rpx;\r\n\t\tbox-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.1);\r\n\t\tposition: relative;\r\n\t}\r\n\r\n\t.card-deleted {\r\n\t\topacity: 0.5;\r\n\t\tpointer-events: none;\r\n\t\tbackground: #f5f5f5;\r\n\t\tborder: 2rpx dashed #ccc;\r\n\t}\r\n\t\r\n\t.card-deleted .stock-name,\r\n\t.card-deleted .amount-value,\r\n\t.card-deleted .price-value {\r\n\t\tcolor: #999;\r\n\t\ttext-decoration: line-through;\r\n\t}\r\n\t\r\n\t.card-deleted .delete-btn {\r\n\t\tbackground: #00d4aa;\r\n\t\tpointer-events: auto;\r\n\t}\r\n\r\n\t.delete-btn {\r\n\t\tposition: absolute;\r\n\t\ttop: 15rpx;\r\n\t\tright: 15rpx;\r\n\t\tbackground: #ff4757;\r\n\t\tborder-radius: 50%;\r\n\t\twidth: 50rpx;\r\n\t\theight: 50rpx;\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t\tfont-size: 30rpx;\r\n\t\tcolor: white;\r\n\t\tz-index: 1;\r\n\t\tcursor: pointer;\r\n\t\ttransition: background-color 0.2s;\r\n\t}\r\n\r\n\t.delete-btn:hover {\r\n\t\tbackground: #e03e4e;\r\n\t}\r\n\r\n\t.delete-icon {\r\n\t\tfont-size: 30rpx;\r\n\t}\r\n\r\n\t.holding-header {\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: space-between;\r\n\t\talign-items: flex-start;\r\n\t\tmargin-bottom: 20rpx;\r\n\t}\r\n\r\n\t.stock-name-wrapper {\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t}\r\n\r\n\t.stock-name {\r\n\t\tcolor: #333;\r\n\t\tfont-size: 30rpx;\r\n\t\tfont-weight: bold;\r\n\t\tmargin-right: 8rpx;\r\n\t}\r\n\r\n\t.lock-icon {\r\n\t\tfont-size: 20rpx;\r\n\t\tcolor: #999;\r\n\t}\r\n\r\n\t.stock-name-input {\r\n\t\tmax-width: 200rpx;\r\n\t\tfont-size: 30rpx;\r\n\t\tfont-weight: bold;\r\n\t\tcolor: #333;\r\n\t\tborder: 2rpx solid #007aff;\r\n\t\tborder-radius: 10rpx;\r\n\t\tpadding: 12rpx 16rpx;\r\n\t\tbackground: #f8f9fa;\r\n\t\ttext-align: center;\r\n\t\tbox-shadow: 0 2rpx 8rpx rgba(0, 122, 255, 0.1);\r\n\t}\r\n\r\n\t.position-percentage {\r\n\t\tfont-size: 22rpx;\r\n\t\tcolor: #007aff;\r\n\t\tbackground: #e8f4ff;\r\n\t\tpadding: 4rpx 10rpx;\r\n\t\tborder-radius: 6rpx;\r\n\t}\r\n\r\n\t.stock-change {\r\n\t\tfont-size: 22rpx;\r\n\t\tpadding: 4rpx 10rpx;\r\n\t\tborder-radius: 6rpx;\r\n\t}\r\n\r\n\t.stock-change.positive {\r\n\t\tcolor: #ff4757;\r\n\t\tbackground: #fff1f0;\r\n\t}\r\n\r\n\t.stock-change.negative {\r\n\t\tcolor: #00d4aa;\r\n\t\tbackground: #f0fff4;\r\n\t}\r\n\r\n\t.change-input {\r\n\t\tmax-width: 100rpx;\r\n\t\tfont-size: 24rpx;\r\n\t\tcolor: #333;\r\n\t\tpadding: 12rpx 16rpx;\r\n\t\tborder-radius: 8rpx;\r\n\t\tborder: 2rpx solid #007aff;\r\n\t\tbackground: #f8f9fa;\r\n\t\ttext-align: right;\r\n\t\tfont-weight: 500;\r\n\t\tbox-shadow: 0 1rpx 6rpx rgba(0, 122, 255, 0.1);\r\n\t\ttransition: all 0.2s;\r\n\t}\r\n\r\n\t.stock-price {\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: space-between;\r\n\t\talign-items: center;\r\n\t\tmargin-bottom: 25rpx;\r\n\t}\r\n\r\n\t.price-value {\r\n\t\tfont-size: 40rpx;\r\n\t\tfont-weight: bold;\r\n\t\tcolor: #333;\r\n\t}\r\n\r\n\t.price-input {\r\n\t\tmax-width: 100rpx;\r\n\t\tfont-size: 40rpx;\r\n\t\tfont-weight: bold;\r\n\t\tcolor: #333;\r\n\t\tborder: 2rpx solid #007aff;\r\n\t\tborder-radius: 10rpx;\r\n\t\tpadding: 12rpx 16rpx;\r\n\t\tbackground: #f8f9fa;\r\n\t\ttext-align: right;\r\n\t\tbox-shadow: 0 2rpx 8rpx rgba(0, 122, 255, 0.1);\r\n\t}\r\n\r\n\t.holding-amounts {\r\n\t\tmargin-bottom: 25rpx;\r\n\t}\r\n\r\n\t.amount-labels {\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: space-between;\r\n\t\tmargin-bottom: 8rpx;\r\n\t}\r\n\r\n\t.amount-label {\r\n\t\tcolor: #666;\r\n\t\tfont-size: 22rpx;\r\n\t}\r\n\r\n\t.amount-row {\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: space-between;\r\n\t\tmargin-bottom: 8rpx;\r\n\t}\r\n\r\n\t.amount-field {\r\n\t\tflex: 1;\r\n\t\tmargin-right: 10rpx;\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: center;\r\n\t\talign-items: center;\r\n\t}\r\n\r\n\t.amount-field:last-child {\r\n\t\tmargin-right: 0;\r\n\t}\r\n\r\n\t.amount-value {\r\n\t\tcolor: #333;\r\n\t\tfont-weight: bold;\r\n\t\tfont-size: 24rpx;\r\n\t\tcursor: pointer;\r\n\t\tpadding: 2rpx 4rpx;\r\n\t\tborder-radius: 4rpx;\r\n\t\ttransition: background-color 0.2s;\r\n\t}\r\n\r\n\t.amount-value:hover {\r\n\t\tbackground-color: #f0f0f0;\r\n\t}\r\n\r\n\t.amount-value.profit {\r\n\t\tcolor: #ff4757;\r\n\t}\r\n\r\n\t.amount-value.loss {\r\n\t\tcolor: #00d4aa;\r\n\t}\r\n\r\n\t.amount-input {\r\n\t\tmax-width: 150rpx;\r\n\t\tfont-size: 24rpx;\r\n\t\tcolor: #333;\r\n\t\tpadding: 12rpx 16rpx;\r\n\t\tborder-radius: 8rpx;\r\n\t\tborder: 2rpx solid #007aff;\r\n\t\tbackground: #f8f9fa;\r\n\t\ttext-align: right;\r\n\t\tfont-weight: 500;\r\n\t\tbox-shadow: 0 1rpx 6rpx rgba(0, 122, 255, 0.1);\r\n\t\ttransition: all 0.2s;\r\n\t}\r\n\r\n\t/* 今日操作 */\r\n\t.operations-section {\r\n\t\tmargin: 20rpx;\r\n\t}\r\n\r\n\t.operations-list {\r\n\t\tbackground: white;\r\n\t\tborder-radius: 16rpx;\r\n\t\toverflow: hidden;\r\n\t\tbox-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.1);\r\n\t}\r\n\r\n\t.operation-group {\r\n\t\tborder-bottom: 1rpx solid #f5f5f5;\r\n\t\tpadding: 30rpx;\r\n\t}\r\n\r\n\t.operation-group:last-child {\r\n\t\tborder-bottom: none;\r\n\t}\r\n\r\n\t.operation-stock-header {\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: space-between;\r\n\t\tmargin-bottom: 20rpx;\r\n\t\tgap: 15rpx;\r\n\t}\r\n\r\n\t.operation-stock {\r\n\t\tcolor: #333;\r\n\t\tfont-size: 28rpx;\r\n\t\tfont-weight: bold;\r\n\t\tflex-shrink: 0;\r\n\t}\r\n\r\n\t.current-price {\r\n\t\tfont-size: 26rpx;\r\n\t\tfont-weight: bold;\r\n\t\tflex-shrink: 0;\r\n\t}\r\n\r\n\t.current-price.positive {\r\n\t\tcolor: #ff4757;\r\n\t}\r\n\r\n\t.current-price.negative {\r\n\t\tcolor: #00d4aa;\r\n\t}\r\n\r\n\t.price-change {\r\n\t\tfont-size: 22rpx;\r\n\t\tpadding: 2rpx 8rpx;\r\n\t\tborder-radius: 4rpx;\r\n\t\tfont-weight: 500;\r\n\t\tflex-shrink: 0;\r\n\t}\r\n\r\n\t.price-change.positive {\r\n\t\tcolor: #ff4757;\r\n\t\tbackground: #fff1f0;\r\n\t}\r\n\r\n\t.price-change.negative {\r\n\t\tcolor: #00d4aa;\r\n\t\tbackground: #f0fff4;\r\n\t}\r\n\r\n\t.holder-count {\r\n\t\tfont-size: 20rpx;\r\n\t\tcolor: #007aff;\r\n\t\tbackground: #e8f4ff;\r\n\t\tpadding: 4rpx 8rpx;\r\n\t\tborder-radius: 6rpx;\r\n\t\tfont-weight: 500;\r\n\t\tflex-shrink: 0;\r\n\t}\r\n\r\n\t.operations-list-continuous {\r\n\t\tmargin-bottom: 20rpx;\r\n\t}\r\n\r\n\t.operations-list-continuous .operation-item {\r\n\t\tmargin-bottom: 10rpx;\r\n\t\tpadding: 15rpx;\r\n\t\tbackground: #f8f9fa;\r\n\t\tborder-radius: 8rpx;\r\n\t}\r\n\r\n\t.operations-list-continuous .operation-item:last-child {\r\n\t\tmargin-bottom: 0;\r\n\t}\r\n\r\n\t.operation-notes {\r\n\t\tmargin-top: 15rpx;\r\n\t}\r\n\r\n\t.reasons-section,\r\n\t.analyses-section {\r\n\t\tmargin-bottom: 20rpx;\r\n\t}\r\n\r\n\t.reasons-section:last-child,\r\n\t.analyses-section:last-child {\r\n\t\tmargin-bottom: 0;\r\n\t}\r\n\r\n\t.section-subtitle {\r\n\t\tdisplay: block;\r\n\t\tfont-size: 26rpx;\r\n\t\tfont-weight: bold;\r\n\t\tcolor: #333;\r\n\t\tmargin-bottom: 15rpx;\r\n\t}\r\n\r\n\t.reason-item,\r\n\t.analysis-item {\r\n\t\tbackground: #fffbeb;\r\n\t\tpadding: 20rpx;\r\n\t\tborder-radius: 8rpx;\r\n\t\tmargin-bottom: 10rpx;\r\n\t\tborder-left: 4rpx solid #d97706;\r\n\t}\r\n\r\n\t.analysis-item {\r\n\t\tbackground: #f0f9ff;\r\n\t\tborder-left: 4rpx solid #0369a1;\r\n\t}\r\n\r\n\t.reason-item:last-child,\r\n\t.analysis-item:last-child {\r\n\t\tmargin-bottom: 0;\r\n\t}\r\n\r\n\t.reason-content,\r\n\t.analysis-content {\r\n\t\tdisplay: block;\r\n\t\tfont-size: 24rpx;\r\n\t\tline-height: 1.6;\r\n\t\tmargin-bottom: 8rpx;\r\n\t}\r\n\r\n\t.reason-content {\r\n\t\tcolor: #d97706;\r\n\t}\r\n\r\n\t.analysis-content {\r\n\t\tcolor: #0369a1;\r\n\t}\r\n\r\n\t.reason-date,\r\n\t.analysis-date {\r\n\t\tdisplay: block;\r\n\t\tfont-size: 20rpx;\r\n\t\tcolor: #999;\r\n\t\ttext-align: right;\r\n\t}\r\n\r\n\t.operation-header {\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: space-between;\r\n\t\talign-items: center;\r\n\t\tmargin-bottom: 10rpx;\r\n\t}\r\n\r\n\t.operation-type {\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tpadding: 8rpx 16rpx;\r\n\t\tborder-radius: 8rpx;\r\n\t\tgap: 8rpx;\r\n\t}\r\n\r\n\t.operation-type.buy {\r\n\t\tbackground: #fff1f0;\r\n\t\tcolor: #ff4757;\r\n\t}\r\n\r\n\t.operation-type.sell {\r\n\t\tbackground: #f0fff4;\r\n\t\tcolor: #00d4aa;\r\n\t}\r\n\r\n\t.type-icon {\r\n\t\tfont-size: 20rpx;\r\n\t}\r\n\r\n\t.type-text {\r\n\t\tfont-size: 24rpx;\r\n\t}\r\n\r\n\t.operation-details {\r\n\t\tcolor: #666;\r\n\t\tfont-size: 24rpx;\r\n\t}\r\n\r\n\t/* 悬浮按钮 */\r\n\t.floating-button {\r\n\t\tposition: fixed;\r\n\t\tright: 30rpx;\r\n\t\tbottom: 160rpx;\r\n\t\twidth: 100rpx;\r\n\t\theight: 100rpx;\r\n\t\tbackground: #007aff;\r\n\t\tborder-radius: 50%;\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t\tbox-shadow: 0 4rpx 12rpx rgba(0, 122, 255, 0.4);\r\n\t\tz-index: 100;\r\n\t}\r\n\r\n\t.float-icon {\r\n\t\tcolor: white;\r\n\t\tfont-size: 48rpx;\r\n\t\tfont-weight: 300;\r\n\t}\r\n\r\n\t/* 底部按钮 */\r\n\t.bottom-button {\r\n\t\tposition: fixed;\r\n\t\tbottom: 30rpx;\r\n\t\tleft: 30rpx;\r\n\t\tright: 30rpx;\r\n\t\theight: 80rpx;\r\n\t\tbackground: #007aff;\r\n\t\tborder-radius: 40rpx;\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t\tbox-shadow: 0 4rpx 12rpx rgba(0, 122, 255, 0.4);\r\n\t\tz-index: 100;\r\n\t}\r\n\r\n\t.bottom-text {\r\n\t\tcolor: white;\r\n\t\tfont-size: 32rpx;\r\n\t\tfont-weight: 500;\r\n\t}\r\n\r\n\t/* 编辑模式按钮 */\r\n\t.edit-buttons {\r\n\t\tposition: fixed;\r\n\t\tbottom: 160rpx; /* 调整位置,使其在悬浮按钮下方 */\r\n\t\tleft: 30rpx;\r\n\t\tright: 30rpx;\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: space-around;\r\n\t\tz-index: 100;\r\n\t}\r\n\r\n\t.edit-button {\r\n\t\tflex: 1;\r\n\t\tmargin: 0 10rpx;\r\n\t\theight: 80rpx;\r\n\t\tborder-radius: 40rpx;\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t\tfont-size: 32rpx;\r\n\t\tfont-weight: 500;\r\n\t\tcursor: pointer;\r\n\t\ttransition: background-color 0.2s;\r\n\t}\r\n\r\n\t.edit-button.cancel {\r\n\t\tbackground-color: #f0f0f0;\r\n\t\tcolor: #333;\r\n\t}\r\n\r\n\t.edit-button.submit {\r\n\t\tbackground-color: #007aff;\r\n\t\tcolor: white;\r\n\t}\r\n\r\n\t.edit-button.cancel:hover {\r\n\t\tbackground-color: #e0e0e0;\r\n\t}\r\n\r\n\t.edit-button.submit:hover {\r\n\t\tbackground-color: #0056b3;\r\n\t}\r\n\r\n\t.edit-button-text {\r\n\t\tfont-size: 32rpx;\r\n\t}\r\n</style>\r\n","import MiniProgramPage from 'D:/wllj/inversment-diary/frontend/inversment-diary/pages/index/index.vue'\nwx.createPage(MiniProgramPage)"],"names":["uni"],"mappings":"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"}
\ No newline at end of file
frontend/inversment-diary/unpackage/dist/dev/mp-weixin/app.js
deleted
100644 → 0
View file @
c5b00f12
"
use strict
"
;
Object
.
defineProperty
(
exports
,
Symbol
.
toStringTag
,
{
value
:
"
Module
"
});
const
common_vendor
=
require
(
"
./common/vendor.js
"
);
if
(
!
Math
)
{
"
./pages/index/index.js
"
;
}
const
_sfc_main
=
{
onLaunch
:
function
()
{
common_vendor
.
index
.
__f__
(
"
log
"
,
"
at App.vue:4
"
,
"
App Launch
"
);
},
onShow
:
function
()
{
common_vendor
.
index
.
__f__
(
"
log
"
,
"
at App.vue:7
"
,
"
App Show
"
);
},
onHide
:
function
()
{
common_vendor
.
index
.
__f__
(
"
log
"
,
"
at App.vue:10
"
,
"
App Hide
"
);
}
};
function
createApp
()
{
const
app
=
common_vendor
.
createSSRApp
(
_sfc_main
);
return
{
app
};
}
createApp
().
app
.
mount
(
"
#app
"
);
exports
.
createApp
=
createApp
;
//# sourceMappingURL=../.sourcemap/mp-weixin/app.js.map
frontend/inversment-diary/unpackage/dist/dev/mp-weixin/app.json
deleted
100644 → 0
View file @
c5b00f12
{
"pages"
:
[
"pages/index/index"
],
"window"
:
{
"navigationBarTextStyle"
:
"white"
,
"navigationBarTitleText"
:
"韭家投资日记"
,
"navigationBarBackgroundColor"
:
"#4A90E2"
,
"backgroundColor"
:
"#f5f5f5"
},
"usingComponents"
:
{}
}
\ No newline at end of file
frontend/inversment-diary/unpackage/dist/dev/mp-weixin/app.wxss
deleted
100644 → 0
View file @
c5b00f12
/*每个页面公共css */
page{--status-bar-height:25px;--top-window-height:0px;--window-top:0px;--window-bottom:0px;--window-left:0px;--window-right:0px;--window-magin:0px}[data-c-h="true"]{display: none !important;}
\ No newline at end of file
frontend/inversment-diary/unpackage/dist/dev/mp-weixin/common/assets.js
deleted
100644 → 0
View file @
c5b00f12
"
use strict
"
;
const
_imports_0
=
"
/static/logo.png
"
;
exports
.
_imports_0
=
_imports_0
;
//# sourceMappingURL=../../.sourcemap/mp-weixin/common/assets.js.map
frontend/inversment-diary/unpackage/dist/dev/mp-weixin/common/vendor.js
deleted
100644 → 0
View file @
c5b00f12
Source diff could not be displayed: it is too large. Options to address this:
view the blob
.
frontend/inversment-diary/unpackage/dist/dev/mp-weixin/pages/index/index.js
deleted
100644 → 0
View file @
c5b00f12
"
use strict
"
;
const
common_vendor
=
require
(
"
../../common/vendor.js
"
);
const
_sfc_main
=
{
data
()
{
return
{
currentDate
:
""
,
currentDateText
:
""
,
showCalendarPicker
:
false
,
calendarYear
:
(
/* @__PURE__ */
new
Date
()).
getFullYear
(),
calendarMonth
:
(
/* @__PURE__ */
new
Date
()).
getMonth
()
+
1
,
calendarWeeks
:
[],
selectedDate
:
null
,
positionPercentage
:
85
,
// 持仓仓位百分比 - 保留用于测试
hasModifications
:
false
,
// 是否有修改
latestTradingDate
:
""
,
// 最新交易日 - 由initDate方法设置
isEditMode
:
false
,
// 是否处于编辑模式
// 可编辑的基础数据
accountBalance
:
"
332,646
"
,
// 账户余额
todayProfit
:
"
+¥4,820
"
,
// 今日盈亏
// 编辑模式的临时数据
editData
:
{
accountBalance
:
""
,
todayProfit
:
""
,
holdings
:
[]
},
holdings
:
[
{
name
:
"
北方稀土
"
,
stockCode
:
"
600111
"
,
change
:
"
+9.91%
"
,
changeClass
:
"
positive
"
,
amount
:
"
45,900
"
,
position
:
"
14%
"
,
position2
:
"
20%
"
,
price
:
"
38.25
"
,
profitLoss
:
"
+1,200
"
,
isDeleted
:
false
,
isNameLocked
:
true
},
{
name
:
"
中国电建
"
,
stockCode
:
"
601669
"
,
change
:
"
+14.56%
"
,
changeClass
:
"
positive
"
,
amount
:
"
11,800
"
,
position
:
"
20%
"
,
position2
:
"
20%
"
,
price
:
"
11.8
"
,
profitLoss
:
"
-800
"
,
isDeleted
:
false
,
isNameLocked
:
true
}
],
operations
:
[
{
stockName
:
"
北方稀土
"
,
currentPrice
:
"
38.25
"
,
priceChange
:
"
+9.91%
"
,
holderCount
:
120
,
operations
:
[
{
type
:
"
buy
"
,
typeText
:
"
买入
"
,
price
:
"
11.2
"
,
quantity
:
"
1000
"
},
{
type
:
"
sell
"
,
typeText
:
"
卖出
"
,
price
:
"
11.7
"
,
quantity
:
"
1000
"
}
],
reasons
:
[
{
content
:
"
看好稀土行业发展前景,近期有政策利好
"
,
date
:
"
2024-01-15
"
},
{
content
:
"
国家新能源汽车政策持续推进,稀土需求增长
"
,
date
:
"
2024-01-14
"
}
],
analyses
:
[
{
content
:
"
买入价格合适,但是买入时机不够理想,应该在大盘调整时买入
"
,
date
:
"
2024-01-15
"
},
{
content
:
"
卖出时机把握较好,获得了不错的收益
"
,
date
:
"
2024-01-15
"
}
]
},
{
stockName
:
"
中国电建
"
,
currentPrice
:
"
11.8
"
,
priceChange
:
"
+14.56%
"
,
holderCount
:
80
,
operations
:
[
{
type
:
"
buy
"
,
typeText
:
"
买入
"
,
price
:
"
11.2
"
,
quantity
:
"
1000
"
},
{
type
:
"
sell
"
,
typeText
:
"
卖出
"
,
price
:
"
11.7
"
,
quantity
:
"
1000
"
}
],
reasons
:
[
{
content
:
"
基建板块有回暖迹象,估值处于低位
"
,
date
:
"
2024-01-15
"
},
{
content
:
"
一带一路政策持续推进,海外业务增长潜力大
"
,
date
:
"
2024-01-14
"
}
],
analyses
:
[
{
content
:
"
买入时机适中,但是仓位控制不够理想,应该分批买入
"
,
date
:
"
2024-01-15
"
},
{
content
:
"
整体操作策略正确,但可以更加耐心等待更好的入场时机
"
,
date
:
"
2024-01-15
"
}
]
}
]
};
},
computed
:
{
positionLevelClass
()
{
const
percentage
=
parseFloat
(
this
.
calculatedPositionPercentage
)
||
0
;
if
(
percentage
<=
50
)
{
return
"
position-safe
"
;
}
else
if
(
percentage
<=
80
)
{
return
"
position-medium
"
;
}
else
{
return
"
position-high
"
;
}
},
progressStyle
()
{
const
percentage
=
parseFloat
(
this
.
calculatedPositionPercentage
)
||
0
;
let
background
=
""
;
if
(
percentage
<=
50
)
{
const
degree
=
percentage
*
3.6
;
background
=
`conic-gradient(#00d4aa 0deg
${
degree
}
deg, #e6f7ff
${
degree
}
deg 360deg)`
;
}
else
if
(
percentage
<=
80
)
{
const
greenDegree
=
50
*
3.6
;
const
orangeDegree
=
percentage
*
3.6
;
background
=
`conic-gradient(
#00d4aa 0deg
${
greenDegree
}
deg,
#ffa502
${
greenDegree
}
deg
${
orangeDegree
}
deg,
#e6f7ff
${
orangeDegree
}
deg 360deg
)`
;
}
else
{
const
greenDegree
=
50
*
3.6
;
const
orangeDegree
=
80
*
3.6
;
const
redDegree
=
percentage
*
3.6
;
background
=
`conic-gradient(
#00d4aa 0deg
${
greenDegree
}
deg,
#ffa502
${
greenDegree
}
deg
${
orangeDegree
}
deg,
#ff4757
${
orangeDegree
}
deg
${
redDegree
}
deg,
#e6f7ff
${
redDegree
}
deg 360deg
)`
;
}
return
{
background
};
},
showSubmitButton
()
{
return
this
.
currentDate
===
this
.
latestTradingDate
&&
this
.
hasModifications
;
},
// 计算仓位百分比
calculatedPositionPercentage
()
{
try
{
const
accountBalanceNum
=
parseFloat
(
this
.
accountBalance
.
replace
(
/
[
¥,
]
/g
,
""
));
const
totalHoldingAmount
=
this
.
holdings
.
reduce
((
sum
,
holding
)
=>
{
const
amount
=
parseFloat
(
holding
.
amount
.
replace
(
/
[
¥,
]
/g
,
""
))
||
0
;
return
sum
+
amount
;
},
0
);
common_vendor
.
index
.
__f__
(
"
log
"
,
"
at pages/index/index.vue:410
"
,
"
=== 持仓仓位计算 ===
"
);
common_vendor
.
index
.
__f__
(
"
log
"
,
"
at pages/index/index.vue:411
"
,
"
账户余额字符串:
"
,
this
.
accountBalance
);
common_vendor
.
index
.
__f__
(
"
log
"
,
"
at pages/index/index.vue:412
"
,
"
账户余额数字:
"
,
accountBalanceNum
);
common_vendor
.
index
.
__f__
(
"
log
"
,
"
at pages/index/index.vue:413
"
,
"
持仓明细:
"
,
this
.
holdings
.
map
((
h
)
=>
({
name
:
h
.
name
,
amount
:
h
.
amount
,
parsed
:
parseFloat
(
h
.
amount
.
replace
(
/
[
¥,
]
/g
,
""
))
})));
common_vendor
.
index
.
__f__
(
"
log
"
,
"
at pages/index/index.vue:414
"
,
"
总持仓金额:
"
,
totalHoldingAmount
);
if
(
accountBalanceNum
===
0
||
totalHoldingAmount
===
0
)
{
common_vendor
.
index
.
__f__
(
"
log
"
,
"
at pages/index/index.vue:418
"
,
"
返回0 - 账户余额或持仓金额为0
"
);
return
"
0.0
"
;
}
const
percentage
=
totalHoldingAmount
/
accountBalanceNum
*
100
;
const
result
=
Math
.
min
(
100
,
Math
.
max
(
0
,
percentage
)).
toFixed
(
1
);
common_vendor
.
index
.
__f__
(
"
log
"
,
"
at pages/index/index.vue:425
"
,
"
计算结果:
"
,
percentage
,
"
最终结果:
"
,
result
);
return
result
;
}
catch
(
error
)
{
common_vendor
.
index
.
__f__
(
"
error
"
,
"
at pages/index/index.vue:428
"
,
"
计算仓位百分比错误:
"
,
error
);
return
"
0.0
"
;
}
},
// 计算盈亏比例
calculatedProfitRatio
()
{
try
{
const
accountBalanceNum
=
parseFloat
(
this
.
accountBalance
.
replace
(
/
[
¥,
]
/g
,
""
))
||
0
;
const
todayProfitNum
=
parseFloat
(
this
.
todayProfit
.
replace
(
/
[
+¥,
]
/g
,
""
))
||
0
;
const
principalAmount
=
accountBalanceNum
-
todayProfitNum
;
common_vendor
.
index
.
__f__
(
"
log
"
,
"
at pages/index/index.vue:445
"
,
"
=== 盈亏比例计算 ===
"
);
common_vendor
.
index
.
__f__
(
"
log
"
,
"
at pages/index/index.vue:446
"
,
"
账户余额:
"
,
accountBalanceNum
);
common_vendor
.
index
.
__f__
(
"
log
"
,
"
at pages/index/index.vue:447
"
,
"
今日盈亏:
"
,
todayProfitNum
);
common_vendor
.
index
.
__f__
(
"
log
"
,
"
at pages/index/index.vue:448
"
,
"
投入本金:
"
,
principalAmount
);
if
(
accountBalanceNum
===
0
||
principalAmount
===
0
)
{
common_vendor
.
index
.
__f__
(
"
log
"
,
"
at pages/index/index.vue:452
"
,
"
返回0 - 账户余额或投入本金为0
"
);
return
"
0.00
"
;
}
const
percentage
=
todayProfitNum
/
principalAmount
*
100
;
const
result
=
(
percentage
>=
0
?
"
+
"
:
""
)
+
percentage
.
toFixed
(
2
);
common_vendor
.
index
.
__f__
(
"
log
"
,
"
at pages/index/index.vue:459
"
,
"
计算结果:
"
,
percentage
,
"
最终结果:
"
,
result
);
return
result
;
}
catch
(
error
)
{
common_vendor
.
index
.
__f__
(
"
error
"
,
"
at pages/index/index.vue:462
"
,
"
计算盈亏比例错误:
"
,
error
);
return
"
0.00
"
;
}
}
},
onLoad
()
{
this
.
initDate
();
},
onShow
()
{
},
methods
:
{
initDate
()
{
const
now
=
/* @__PURE__ */
new
Date
();
const
year
=
now
.
getFullYear
();
const
month
=
(
now
.
getMonth
()
+
1
).
toString
().
padStart
(
2
,
"
0
"
);
const
day
=
now
.
getDate
().
toString
().
padStart
(
2
,
"
0
"
);
this
.
currentDate
=
`
${
year
}
-
${
month
}
-
${
day
}
`
;
this
.
latestTradingDate
=
this
.
currentDate
;
this
.
selectedDate
=
now
;
this
.
updateDateText
(
this
.
currentDate
);
this
.
generateCalendar
();
},
updateDateText
(
dateStr
)
{
const
date
=
new
Date
(
dateStr
);
const
year
=
date
.
getFullYear
();
const
month
=
date
.
getMonth
()
+
1
;
const
day
=
date
.
getDate
();
const
weekDays
=
[
"
日
"
,
"
一
"
,
"
二
"
,
"
三
"
,
"
四
"
,
"
五
"
,
"
六
"
];
const
weekDay
=
weekDays
[
date
.
getDay
()];
this
.
currentDateText
=
`
${
year
}
年
${
month
}
月
${
day
}
日 星期
${
weekDay
}
`
;
},
showCalendar
()
{
this
.
showCalendarPicker
=
true
;
this
.
generateCalendar
();
},
hideCalendar
()
{
this
.
showCalendarPicker
=
false
;
},
generateCalendar
()
{
const
year
=
this
.
calendarYear
;
const
month
=
this
.
calendarMonth
-
1
;
const
firstDay
=
new
Date
(
year
,
month
,
1
);
const
lastDay
=
new
Date
(
year
,
month
+
1
,
0
);
let
firstDayWeek
=
firstDay
.
getDay
();
firstDayWeek
=
firstDayWeek
===
0
?
6
:
firstDayWeek
-
1
;
const
weeks
=
[];
let
week
=
[];
const
prevMonth
=
month
===
0
?
11
:
month
-
1
;
const
prevYear
=
month
===
0
?
year
-
1
:
year
;
const
prevLastDay
=
new
Date
(
prevYear
,
prevMonth
+
1
,
0
).
getDate
();
for
(
let
i
=
firstDayWeek
-
1
;
i
>=
0
;
i
--
)
{
week
.
push
({
day
:
prevLastDay
-
i
,
isCurrentMonth
:
false
,
isSelected
:
false
,
isToday
:
false
,
date
:
new
Date
(
prevYear
,
prevMonth
,
prevLastDay
-
i
)
});
}
const
today
=
/* @__PURE__ */
new
Date
();
for
(
let
day
=
1
;
day
<=
lastDay
.
getDate
();
day
++
)
{
const
currentDate
=
new
Date
(
year
,
month
,
day
);
const
isToday
=
today
.
getFullYear
()
===
year
&&
today
.
getMonth
()
===
month
&&
today
.
getDate
()
===
day
;
const
isSelected
=
this
.
selectedDate
&&
this
.
selectedDate
.
getFullYear
()
===
year
&&
this
.
selectedDate
.
getMonth
()
===
month
&&
this
.
selectedDate
.
getDate
()
===
day
;
week
.
push
({
day
,
isCurrentMonth
:
true
,
isSelected
,
isToday
,
date
:
currentDate
});
if
(
week
.
length
===
7
)
{
weeks
.
push
(
week
);
week
=
[];
}
}
const
nextMonth
=
month
===
11
?
0
:
month
+
1
;
const
nextYear
=
month
===
11
?
year
+
1
:
year
;
let
nextDay
=
1
;
while
(
week
.
length
<
7
)
{
week
.
push
({
day
:
nextDay
,
isCurrentMonth
:
false
,
isSelected
:
false
,
isToday
:
false
,
date
:
new
Date
(
nextYear
,
nextMonth
,
nextDay
)
});
nextDay
++
;
}
weeks
.
push
(
week
);
this
.
calendarWeeks
=
weeks
;
},
prevMonth
()
{
if
(
this
.
calendarMonth
===
1
)
{
this
.
calendarMonth
=
12
;
this
.
calendarYear
--
;
}
else
{
this
.
calendarMonth
--
;
}
this
.
generateCalendar
();
},
nextMonth
()
{
if
(
this
.
calendarMonth
===
12
)
{
this
.
calendarMonth
=
1
;
this
.
calendarYear
++
;
}
else
{
this
.
calendarMonth
++
;
}
this
.
generateCalendar
();
},
selectDate
(
day
)
{
if
(
!
day
.
isCurrentMonth
)
return
;
this
.
selectedDate
=
day
.
date
;
const
year
=
day
.
date
.
getFullYear
();
const
month
=
(
day
.
date
.
getMonth
()
+
1
).
toString
().
padStart
(
2
,
"
0
"
);
const
dayNum
=
day
.
date
.
getDate
().
toString
().
padStart
(
2
,
"
0
"
);
this
.
currentDate
=
`
${
year
}
-
${
month
}
-
${
dayNum
}
`
;
this
.
updateDateText
(
this
.
currentDate
);
this
.
generateCalendar
();
this
.
hideCalendar
();
this
.
loadDateData
(
this
.
currentDate
);
},
loadDateData
(
date
)
{
common_vendor
.
index
.
__f__
(
"
log
"
,
"
at pages/index/index.vue:613
"
,
"
加载日期数据:
"
,
date
);
this
.
resetModifications
();
common_vendor
.
index
.
showToast
({
title
:
`已切换到
${
date
}
`
,
icon
:
"
none
"
,
duration
:
1500
});
},
addRecord
()
{
common_vendor
.
index
.
showToast
({
title
:
"
添加记录
"
,
icon
:
"
none
"
});
},
// 测试方法:用于测试不同仓位的显示效果
testPosition
()
{
const
testValues
=
[
30
,
65
,
90
];
const
currentIndex
=
testValues
.
findIndex
((
val
)
=>
val
===
this
.
positionPercentage
);
const
nextIndex
=
(
currentIndex
+
1
)
%
testValues
.
length
;
this
.
positionPercentage
=
testValues
[
nextIndex
];
this
.
markAsModified
();
common_vendor
.
index
.
showToast
({
title
:
`切换到
${
this
.
positionPercentage
}
%仓位`
,
icon
:
"
none
"
});
},
// 标记数据已修改
markAsModified
()
{
if
(
this
.
currentDate
===
this
.
latestTradingDate
)
{
this
.
hasModifications
=
true
;
}
},
// 提交修改
submitChanges
()
{
common_vendor
.
index
.
showModal
({
title
:
"
确认提交
"
,
content
:
"
确定要提交当前的修改吗?
"
,
success
:
(
res
)
=>
{
if
(
res
.
confirm
)
{
common_vendor
.
index
.
__f__
(
"
log
"
,
"
at pages/index/index.vue:661
"
,
"
提交修改到服务器
"
);
this
.
hasModifications
=
false
;
common_vendor
.
index
.
showToast
({
title
:
"
修改已提交
"
,
icon
:
"
success
"
});
}
}
});
},
// 重置修改状态
resetModifications
()
{
this
.
hasModifications
=
false
;
},
// 切换编辑模式
toggleEditMode
()
{
if
(
!
this
.
isEditMode
)
{
if
(
this
.
currentDate
!==
this
.
latestTradingDate
)
{
common_vendor
.
index
.
showToast
({
title
:
"
只能编辑最新交易日的数据
"
,
icon
:
"
none
"
,
duration
:
2
e3
});
return
;
}
this
.
editData
=
{
accountBalance
:
this
.
accountBalance
,
todayProfit
:
this
.
todayProfit
,
holdings
:
this
.
holdings
.
map
((
holding
)
=>
({
name
:
holding
.
name
,
stockCode
:
holding
.
stockCode
,
amount
:
holding
.
amount
,
profitLoss
:
holding
.
profitLoss
,
price
:
holding
.
price
,
change
:
holding
.
change
,
isNameLocked
:
holding
.
isNameLocked
}))
};
this
.
isEditMode
=
true
;
}
else
{
this
.
isEditMode
=
false
;
}
},
// 编辑持仓金额或盈亏金额
editHoldingAmount
(
index
,
field
)
{
if
(
!
this
.
latestTradingDate
)
{
const
now
=
/* @__PURE__ */
new
Date
();
const
year
=
now
.
getFullYear
();
const
month
=
(
now
.
getMonth
()
+
1
).
toString
().
padStart
(
2
,
"
0
"
);
const
day
=
now
.
getDate
().
toString
().
padStart
(
2
,
"
0
"
);
this
.
latestTradingDate
=
`
${
year
}
-
${
month
}
-
${
day
}
`
;
}
if
(
this
.
currentDate
!==
this
.
latestTradingDate
)
{
common_vendor
.
index
.
showToast
({
title
:
"
只能编辑最新交易日的数据
"
,
icon
:
"
none
"
,
duration
:
2
e3
});
return
;
}
const
holding
=
this
.
holdings
[
index
];
const
currentValue
=
holding
[
field
];
const
fieldName
=
field
===
"
amount
"
?
"
持仓金额
"
:
"
盈亏金额
"
;
common_vendor
.
index
.
showModal
({
title
:
"
编辑
"
+
fieldName
,
content
:
`请输入新的
${
fieldName
}
(当前:
${
currentValue
}
)`
,
editable
:
true
,
placeholderText
:
currentValue
,
success
:
(
res
)
=>
{
if
(
res
.
confirm
&&
res
.
content
)
{
const
newValue
=
res
.
content
.
trim
();
if
(
newValue
!==
currentValue
)
{
this
.
holdings
[
index
][
field
]
=
newValue
;
this
.
markAsModified
();
common_vendor
.
index
.
showToast
({
title
:
fieldName
+
"
已更新
"
,
icon
:
"
success
"
});
}
}
}
});
},
// 编辑账户余额
editAccountBalance
()
{
if
(
this
.
currentDate
!==
this
.
latestTradingDate
)
{
common_vendor
.
index
.
showToast
({
title
:
"
只能编辑最新交易日的数据
"
,
icon
:
"
none
"
,
duration
:
2
e3
});
return
;
}
common_vendor
.
index
.
showModal
({
title
:
"
编辑账户余额
"
,
content
:
`请输入新的账户余额(当前: ¥
${
this
.
accountBalance
}
)`
,
editable
:
true
,
placeholderText
:
this
.
accountBalance
,
success
:
(
res
)
=>
{
if
(
res
.
confirm
&&
res
.
content
)
{
const
newValue
=
res
.
content
.
trim
();
if
(
newValue
!==
this
.
accountBalance
)
{
this
.
accountBalance
=
newValue
;
this
.
markAsModified
();
common_vendor
.
index
.
showToast
({
title
:
"
账户余额已更新
"
,
icon
:
"
success
"
});
}
}
}
});
},
// 编辑今日盈亏
editTodayProfit
()
{
if
(
this
.
currentDate
!==
this
.
latestTradingDate
)
{
common_vendor
.
index
.
showToast
({
title
:
"
只能编辑最新交易日的数据
"
,
icon
:
"
none
"
,
duration
:
2
e3
});
return
;
}
common_vendor
.
index
.
showModal
({
title
:
"
编辑今日盈亏
"
,
content
:
`请输入今日盈亏(当前:
${
this
.
todayProfit
}
)`
,
editable
:
true
,
placeholderText
:
this
.
todayProfit
,
success
:
(
res
)
=>
{
if
(
res
.
confirm
&&
res
.
content
)
{
const
newValue
=
res
.
content
.
trim
();
if
(
newValue
!==
this
.
todayProfit
)
{
this
.
todayProfit
=
newValue
;
this
.
markAsModified
();
common_vendor
.
index
.
showToast
({
title
:
"
今日盈亏已更新
"
,
icon
:
"
success
"
});
}
}
}
});
},
cancelEdit
()
{
this
.
isEditMode
=
false
;
},
submitEdit
()
{
this
.
accountBalance
=
this
.
editData
.
accountBalance
;
this
.
todayProfit
=
this
.
editData
.
todayProfit
;
for
(
let
i
=
0
;
i
<
this
.
holdings
.
length
;
i
++
)
{
if
(
this
.
editData
.
holdings
[
i
])
{
this
.
holdings
[
i
].
name
=
this
.
editData
.
holdings
[
i
].
name
;
this
.
holdings
[
i
].
stockCode
=
this
.
editData
.
holdings
[
i
].
stockCode
;
this
.
holdings
[
i
].
amount
=
this
.
editData
.
holdings
[
i
].
amount
;
this
.
holdings
[
i
].
profitLoss
=
this
.
editData
.
holdings
[
i
].
profitLoss
;
this
.
holdings
[
i
].
price
=
this
.
editData
.
holdings
[
i
].
price
;
this
.
holdings
[
i
].
change
=
this
.
editData
.
holdings
[
i
].
change
;
this
.
holdings
[
i
].
isNameLocked
=
this
.
editData
.
holdings
[
i
].
isNameLocked
;
this
.
holdings
[
i
].
changeClass
=
this
.
editData
.
holdings
[
i
].
change
.
startsWith
(
"
+
"
)
?
"
positive
"
:
"
negative
"
;
}
}
this
.
holdings
=
this
.
holdings
.
filter
((
holding
)
=>
!
holding
.
isDeleted
);
this
.
isEditMode
=
false
;
this
.
markAsModified
();
common_vendor
.
index
.
showToast
({
title
:
"
保存成功
"
,
icon
:
"
success
"
});
},
addHolding
()
{
this
.
showStockSearchModal
();
},
showStockSearchModal
()
{
common_vendor
.
index
.
showModal
({
title
:
"
添加持仓
"
,
content
:
"
请输入股票名称或代码
"
,
editable
:
true
,
placeholderText
:
"
例如:北方稀土、600111
"
,
success
:
(
res
)
=>
{
if
(
res
.
confirm
&&
res
.
content
)
{
const
searchText
=
res
.
content
.
trim
();
if
(
searchText
)
{
this
.
searchStocks
(
searchText
);
}
}
}
});
},
searchStocks
(
searchText
)
{
const
stockDatabase
=
[
{
code
:
"
600111
"
,
name
:
"
北方稀土
"
,
fullName
:
"
北方稀土(600111)
"
},
{
code
:
"
601669
"
,
name
:
"
中国电建
"
,
fullName
:
"
中国电建(601669)
"
},
{
code
:
"
000001
"
,
name
:
"
平安银行
"
,
fullName
:
"
平安银行(000001)
"
},
{
code
:
"
000002
"
,
name
:
"
万科A
"
,
fullName
:
"
万科A(000002)
"
},
{
code
:
"
000858
"
,
name
:
"
五粮液
"
,
fullName
:
"
五粮液(000858)
"
},
{
code
:
"
600036
"
,
name
:
"
招商银行
"
,
fullName
:
"
招商银行(600036)
"
},
{
code
:
"
600519
"
,
name
:
"
贵州茅台
"
,
fullName
:
"
贵州茅台(600519)
"
},
{
code
:
"
600887
"
,
name
:
"
伊利股份
"
,
fullName
:
"
伊利股份(600887)
"
},
{
code
:
"
000676
"
,
name
:
"
智度股份
"
,
fullName
:
"
智度股份(000676)
"
}
];
const
results
=
stockDatabase
.
filter
(
(
stock
)
=>
stock
.
name
.
includes
(
searchText
)
||
stock
.
code
.
includes
(
searchText
)
||
stock
.
fullName
.
includes
(
searchText
)
);
if
(
results
.
length
===
0
)
{
common_vendor
.
index
.
showToast
({
title
:
"
未找到相关股票
"
,
icon
:
"
none
"
});
return
;
}
if
(
results
.
length
===
1
)
{
this
.
confirmAddStock
(
results
[
0
]);
}
else
{
this
.
showStockSelectModal
(
results
);
}
},
showStockSelectModal
(
stocks
)
{
const
itemList
=
stocks
.
map
((
stock
)
=>
stock
.
fullName
);
common_vendor
.
index
.
showActionSheet
({
itemList
,
success
:
(
res
)
=>
{
const
selectedStock
=
stocks
[
res
.
tapIndex
];
this
.
confirmAddStock
(
selectedStock
);
}
});
},
confirmAddStock
(
stock
)
{
const
existingIndex
=
this
.
holdings
.
findIndex
(
(
holding
)
=>
holding
.
name
===
stock
.
name
||
holding
.
stockCode
===
stock
.
code
);
if
(
existingIndex
>=
0
)
{
common_vendor
.
index
.
showToast
({
title
:
"
该股票已存在
"
,
icon
:
"
none
"
});
return
;
}
const
newHolding
=
{
name
:
stock
.
name
,
stockCode
:
stock
.
code
,
change
:
"
+0.00%
"
,
changeClass
:
"
positive
"
,
amount
:
"
0
"
,
position
:
"
0%
"
,
position2
:
"
0%
"
,
price
:
"
0.00
"
,
profitLoss
:
"
+0
"
,
isDeleted
:
false
,
isNameLocked
:
true
// 标记名称已锁定,不可修改
};
this
.
holdings
.
push
(
newHolding
);
if
(
this
.
isEditMode
)
{
this
.
editData
.
holdings
.
push
({
name
:
newHolding
.
name
,
stockCode
:
newHolding
.
stockCode
,
amount
:
newHolding
.
amount
,
profitLoss
:
newHolding
.
profitLoss
,
price
:
newHolding
.
price
,
change
:
newHolding
.
change
,
isNameLocked
:
true
});
}
this
.
markAsModified
();
common_vendor
.
index
.
showToast
({
title
:
`添加
${
stock
.
name
}
成功`
,
icon
:
"
success
"
});
},
toggleDeleteHolding
(
index
)
{
this
.
holdings
[
index
].
isDeleted
=
!
this
.
holdings
[
index
].
isDeleted
;
this
.
markAsModified
();
common_vendor
.
index
.
showToast
({
title
:
this
.
holdings
[
index
].
isDeleted
?
"
删除持仓成功
"
:
"
恢复持仓成功
"
,
icon
:
"
success
"
});
}
}
};
function
_sfc_render
(
_ctx
,
_cache
,
$props
,
$setup
,
$data
,
$options
)
{
return
common_vendor
.
e
({
a
:
common_vendor
.
t
(
$data
.
currentDateText
),
b
:
common_vendor
.
o
((...
args
)
=>
$options
.
showCalendar
&&
$options
.
showCalendar
(...
args
)),
c
:
common_vendor
.
t
(
$data
.
isEditMode
?
"
取消编辑
"
:
"
编辑
"
),
d
:
common_vendor
.
o
((...
args
)
=>
$options
.
toggleEditMode
&&
$options
.
toggleEditMode
(...
args
)),
e
:
$data
.
showCalendarPicker
},
$data
.
showCalendarPicker
?
{
f
:
common_vendor
.
t
(
$data
.
calendarYear
),
g
:
common_vendor
.
t
(
$data
.
calendarMonth
),
h
:
common_vendor
.
o
((...
args
)
=>
$options
.
prevMonth
&&
$options
.
prevMonth
(...
args
)),
i
:
common_vendor
.
o
((...
args
)
=>
$options
.
nextMonth
&&
$options
.
nextMonth
(...
args
)),
j
:
common_vendor
.
f
(
$data
.
calendarWeeks
,
(
week
,
weekIndex
,
i0
)
=>
{
return
{
a
:
common_vendor
.
f
(
week
,
(
day
,
dayIndex
,
i1
)
=>
{
return
{
a
:
common_vendor
.
t
(
day
.
day
),
b
:
dayIndex
,
c
:
!
day
.
isCurrentMonth
?
1
:
""
,
d
:
day
.
isSelected
?
1
:
""
,
e
:
day
.
isToday
?
1
:
""
,
f
:
common_vendor
.
o
((
$event
)
=>
$options
.
selectDate
(
day
),
dayIndex
)
};
}),
b
:
weekIndex
};
}),
k
:
common_vendor
.
o
(()
=>
{
}),
l
:
common_vendor
.
o
((...
args
)
=>
$options
.
hideCalendar
&&
$options
.
hideCalendar
(...
args
))
}
:
{},
{
m
:
!
$data
.
isEditMode
},
!
$data
.
isEditMode
?
{
n
:
common_vendor
.
t
(
$data
.
accountBalance
)
}
:
{
o
:
$data
.
editData
.
accountBalance
,
p
:
common_vendor
.
o
((
$event
)
=>
$data
.
editData
.
accountBalance
=
$event
.
detail
.
value
)
},
{
q
:
common_vendor
.
t
(
$options
.
calculatedPositionPercentage
),
r
:
common_vendor
.
n
(
$options
.
positionLevelClass
),
s
:
common_vendor
.
s
(
$options
.
progressStyle
),
t
:
common_vendor
.
o
((...
args
)
=>
$options
.
testPosition
&&
$options
.
testPosition
(...
args
)),
v
:
!
$data
.
isEditMode
},
!
$data
.
isEditMode
?
{
w
:
common_vendor
.
t
(
$data
.
todayProfit
)
}
:
{
x
:
$data
.
editData
.
todayProfit
,
y
:
common_vendor
.
o
((
$event
)
=>
$data
.
editData
.
todayProfit
=
$event
.
detail
.
value
)
},
{
z
:
common_vendor
.
t
(
$options
.
calculatedProfitRatio
),
A
:
$data
.
isEditMode
},
$data
.
isEditMode
?
{
B
:
common_vendor
.
o
((...
args
)
=>
$options
.
addHolding
&&
$options
.
addHolding
(...
args
))
}
:
{},
{
C
:
common_vendor
.
f
(
$data
.
holdings
,
(
holding
,
index
,
i0
)
=>
{
return
common_vendor
.
e
(
$data
.
isEditMode
?
{
a
:
common_vendor
.
t
(
holding
.
isDeleted
?
"
↶
"
:
"
×
"
),
b
:
common_vendor
.
o
((
$event
)
=>
$options
.
toggleDeleteHolding
(
index
),
index
)
}
:
{},
{
c
:
!
$data
.
isEditMode
||
holding
.
isNameLocked
},
!
$data
.
isEditMode
||
holding
.
isNameLocked
?
common_vendor
.
e
({
d
:
common_vendor
.
t
(
holding
.
name
),
e
:
holding
.
isNameLocked
},
holding
.
isNameLocked
?
{}
:
{})
:
{
f
:
$data
.
editData
.
holdings
[
index
].
name
,
g
:
common_vendor
.
o
((
$event
)
=>
$data
.
editData
.
holdings
[
index
].
name
=
$event
.
detail
.
value
,
index
)
},
{
h
:
common_vendor
.
t
(
holding
.
position
)
},
!
$data
.
isEditMode
?
{
i
:
common_vendor
.
t
(
holding
.
price
)
}
:
{
j
:
$data
.
editData
.
holdings
[
index
].
price
,
k
:
common_vendor
.
o
((
$event
)
=>
$data
.
editData
.
holdings
[
index
].
price
=
$event
.
detail
.
value
,
index
)
},
!
$data
.
isEditMode
?
{
l
:
common_vendor
.
t
(
holding
.
change
),
m
:
common_vendor
.
n
(
holding
.
changeClass
)
}
:
{
n
:
$data
.
editData
.
holdings
[
index
].
change
,
o
:
common_vendor
.
o
((
$event
)
=>
$data
.
editData
.
holdings
[
index
].
change
=
$event
.
detail
.
value
,
index
)
},
!
$data
.
isEditMode
?
{
p
:
common_vendor
.
t
(
holding
.
amount
)
}
:
{
q
:
$data
.
editData
.
holdings
[
index
].
amount
,
r
:
common_vendor
.
o
((
$event
)
=>
$data
.
editData
.
holdings
[
index
].
amount
=
$event
.
detail
.
value
,
index
)
},
!
$data
.
isEditMode
?
{
s
:
common_vendor
.
t
(
holding
.
profitLoss
),
t
:
common_vendor
.
n
(
holding
.
profitLoss
.
startsWith
(
"
+
"
)
?
"
profit
"
:
"
loss
"
)
}
:
{
v
:
$data
.
editData
.
holdings
[
index
].
profitLoss
,
w
:
common_vendor
.
o
((
$event
)
=>
$data
.
editData
.
holdings
[
index
].
profitLoss
=
$event
.
detail
.
value
,
index
)
},
{
x
:
index
,
y
:
holding
.
isDeleted
?
1
:
""
});
}),
D
:
$data
.
isEditMode
,
E
:
!
$data
.
isEditMode
,
F
:
!
$data
.
isEditMode
,
G
:
!
$data
.
isEditMode
,
H
:
!
$data
.
isEditMode
,
I
:
common_vendor
.
f
(
$data
.
operations
,
(
group
,
index
,
i0
)
=>
{
return
common_vendor
.
e
({
a
:
common_vendor
.
t
(
group
.
stockName
),
b
:
common_vendor
.
t
(
group
.
currentPrice
),
c
:
common_vendor
.
n
(
group
.
priceChange
.
startsWith
(
"
+
"
)
?
"
positive
"
:
"
negative
"
),
d
:
common_vendor
.
t
(
group
.
priceChange
),
e
:
common_vendor
.
n
(
group
.
priceChange
.
startsWith
(
"
+
"
)
?
"
positive
"
:
"
negative
"
),
f
:
common_vendor
.
t
(
group
.
holderCount
),
g
:
common_vendor
.
f
(
group
.
operations
,
(
op
,
opIndex
,
i1
)
=>
{
return
{
a
:
common_vendor
.
t
(
op
.
type
===
"
buy
"
?
"
↑
"
:
"
↓
"
),
b
:
common_vendor
.
t
(
op
.
typeText
),
c
:
common_vendor
.
n
(
op
.
type
),
d
:
common_vendor
.
t
(
op
.
price
),
e
:
common_vendor
.
t
(
op
.
quantity
),
f
:
opIndex
};
}),
h
:
group
.
reasons
&&
group
.
reasons
.
length
>
0
||
group
.
analyses
&&
group
.
analyses
.
length
>
0
},
group
.
reasons
&&
group
.
reasons
.
length
>
0
||
group
.
analyses
&&
group
.
analyses
.
length
>
0
?
common_vendor
.
e
({
i
:
group
.
reasons
&&
group
.
reasons
.
length
>
0
},
group
.
reasons
&&
group
.
reasons
.
length
>
0
?
{
j
:
common_vendor
.
f
(
group
.
reasons
,
(
reason
,
reasonIndex
,
i1
)
=>
{
return
{
a
:
common_vendor
.
t
(
reason
.
content
),
b
:
common_vendor
.
t
(
reason
.
date
),
c
:
reasonIndex
};
})
}
:
{},
{
k
:
group
.
analyses
&&
group
.
analyses
.
length
>
0
},
group
.
analyses
&&
group
.
analyses
.
length
>
0
?
{
l
:
common_vendor
.
f
(
group
.
analyses
,
(
analysis
,
analysisIndex
,
i1
)
=>
{
return
{
a
:
common_vendor
.
t
(
analysis
.
content
),
b
:
common_vendor
.
t
(
analysis
.
date
),
c
:
analysisIndex
};
})
}
:
{})
:
{},
{
m
:
index
});
}),
J
:
!
$data
.
isEditMode
},
!
$data
.
isEditMode
?
{
K
:
common_vendor
.
o
((...
args
)
=>
$options
.
addRecord
&&
$options
.
addRecord
(...
args
))
}
:
{},
{
L
:
$data
.
isEditMode
},
$data
.
isEditMode
?
{
M
:
common_vendor
.
o
((...
args
)
=>
$options
.
cancelEdit
&&
$options
.
cancelEdit
(...
args
)),
N
:
common_vendor
.
o
((...
args
)
=>
$options
.
submitEdit
&&
$options
.
submitEdit
(...
args
))
}
:
{},
{
O
:
!
$data
.
isEditMode
&&
$options
.
showSubmitButton
},
!
$data
.
isEditMode
&&
$options
.
showSubmitButton
?
{
P
:
common_vendor
.
o
((...
args
)
=>
$options
.
submitChanges
&&
$options
.
submitChanges
(...
args
))
}
:
{});
}
const
MiniProgramPage
=
/* @__PURE__ */
common_vendor
.
_export_sfc
(
_sfc_main
,
[[
"
render
"
,
_sfc_render
],
[
"
__scopeId
"
,
"
data-v-1cf27b2a
"
]]);
wx
.
createPage
(
MiniProgramPage
);
//# sourceMappingURL=../../../.sourcemap/mp-weixin/pages/index/index.js.map
frontend/inversment-diary/unpackage/dist/dev/mp-weixin/pages/index/index.json
deleted
100644 → 0
View file @
c5b00f12
{
"navigationBarTitleText"
:
"韭家投资日记"
,
"navigationBarTextStyle"
:
"white"
,
"navigationBarBackgroundColor"
:
"#4A90E2"
,
"backgroundColor"
:
"#f5f5f5"
,
"usingComponents"
:
{}
}
\ No newline at end of file
frontend/inversment-diary/unpackage/dist/dev/mp-weixin/pages/index/index.wxml
deleted
100644 → 0
View file @
c5b00f12
<view class="container data-v-1cf27b2a"><view class="date-header data-v-1cf27b2a"><view class="date-selector data-v-1cf27b2a" bindtap="{{b}}"><text class="date-text data-v-1cf27b2a">{{a}}</text><text class="calendar-icon data-v-1cf27b2a">📅</text></view><view class="edit-toggle data-v-1cf27b2a" bindtap="{{d}}"><text class="edit-toggle-text data-v-1cf27b2a">{{c}}</text></view></view><view wx:if="{{e}}" class="calendar-overlay data-v-1cf27b2a" bindtap="{{l}}"><view class="calendar-popup data-v-1cf27b2a" catchtap="{{k}}"><view class="calendar-header data-v-1cf27b2a"><text class="calendar-title data-v-1cf27b2a">{{f}}年{{g}}月</text><view class="calendar-nav data-v-1cf27b2a"><text class="nav-btn data-v-1cf27b2a" bindtap="{{h}}">◀</text><text class="nav-btn data-v-1cf27b2a" bindtap="{{i}}">▶</text></view></view><view class="calendar-weekdays data-v-1cf27b2a"><text class="weekday data-v-1cf27b2a">一</text><text class="weekday data-v-1cf27b2a">二</text><text class="weekday data-v-1cf27b2a">三</text><text class="weekday data-v-1cf27b2a">四</text><text class="weekday data-v-1cf27b2a">五</text><text class="weekday data-v-1cf27b2a">六</text><text class="weekday data-v-1cf27b2a">日</text></view><view class="calendar-days data-v-1cf27b2a"><view wx:for="{{j}}" wx:for-item="week" wx:key="b" class="calendar-row data-v-1cf27b2a"><view wx:for="{{week.a}}" wx:for-item="day" wx:key="b" class="{{['calendar-day', 'data-v-1cf27b2a', day.c && 'other-month', day.d && 'selected', day.e && 'today']}}" bindtap="{{day.f}}"><text class="day-number data-v-1cf27b2a">{{day.a}}</text></view></view></view></view></view><view class="account-overview data-v-1cf27b2a"><view class="balance-section data-v-1cf27b2a"><view class="balance-left data-v-1cf27b2a"><text class="balance-label data-v-1cf27b2a">账户余额</text><view wx:if="{{m}}" class="balance-amount data-v-1cf27b2a">¥{{n}}</view><input wx:else class="balance-input data-v-1cf27b2a" type="text" placeholder="请输入账户余额" value="{{o}}" bindinput="{{p}}"/></view><view class="balance-right data-v-1cf27b2a"><text class="asset-label data-v-1cf27b2a">持仓仓位</text><view class="{{['progress-circle', 'data-v-1cf27b2a', r]}}" style="{{s}}" bindtap="{{t}}"><text class="progress-text data-v-1cf27b2a">{{q}}%</text></view></view></view><view class="profit-section data-v-1cf27b2a"><view class="profit-item data-v-1cf27b2a"><text class="profit-label data-v-1cf27b2a">今日盈亏</text><view wx:if="{{v}}" class="profit-value positive data-v-1cf27b2a">{{w}}</view><view wx:else class="profit-input-wrapper data-v-1cf27b2a"><input class="profit-input data-v-1cf27b2a" type="text" placeholder="请输入今日盈亏" value="{{x}}" bindinput="{{y}}"/></view></view><view class="profit-item data-v-1cf27b2a"><text class="profit-label data-v-1cf27b2a">盈亏比例</text><text class="profit-value positive data-v-1cf27b2a">{{z}}%</text></view></view></view><view class="holdings-section data-v-1cf27b2a"><view class="section-header data-v-1cf27b2a"><text class="section-title data-v-1cf27b2a">持仓</text><view wx:if="{{A}}" class="add-holding-btn data-v-1cf27b2a" bindtap="{{B}}"><text class="add-icon data-v-1cf27b2a">+</text><text class="add-text data-v-1cf27b2a">新增</text></view></view><view class="holdings-grid data-v-1cf27b2a"><view wx:for="{{C}}" wx:for-item="holding" wx:key="x" class="{{['holding-card', 'data-v-1cf27b2a', holding.y && 'card-deleted']}}"><view wx:if="{{D}}" class="delete-btn data-v-1cf27b2a" bindtap="{{holding.b}}"><text class="delete-icon data-v-1cf27b2a">{{holding.a}}</text></view><view class="holding-header data-v-1cf27b2a"><view wx:if="{{holding.c}}" class="stock-name-wrapper data-v-1cf27b2a"><text class="stock-name data-v-1cf27b2a">{{holding.d}}</text><text wx:if="{{holding.e}}" class="lock-icon data-v-1cf27b2a">🔒</text></view><input wx:else class="stock-name-input data-v-1cf27b2a" type="text" placeholder="股票名称" value="{{holding.f}}" bindinput="{{holding.g}}"/><text class="position-percentage data-v-1cf27b2a">仓位 {{holding.h}}</text></view><view class="stock-price data-v-1cf27b2a"><view wx:if="{{E}}" class="price-value data-v-1cf27b2a">{{holding.i}}</view><input wx:else class="price-input data-v-1cf27b2a" type="text" placeholder="价格" value="{{holding.j}}" bindinput="{{holding.k}}"/><view wx:if="{{F}}" class="{{['stock-change', 'data-v-1cf27b2a', holding.m]}}">{{holding.l}}</view><input wx:else class="change-input data-v-1cf27b2a" type="text" placeholder="涨跌幅" value="{{holding.n}}" bindinput="{{holding.o}}"/></view><view class="holding-amounts data-v-1cf27b2a"><view class="amount-labels data-v-1cf27b2a"><text class="amount-label data-v-1cf27b2a">持仓金额</text><text class="amount-label data-v-1cf27b2a">盈亏金额</text></view><view class="amount-row data-v-1cf27b2a"><view class="amount-field data-v-1cf27b2a"><view wx:if="{{G}}" class="amount-value data-v-1cf27b2a">¥{{holding.p}}</view><input wx:else class="amount-input data-v-1cf27b2a" type="text" placeholder="持仓金额" value="{{holding.q}}" bindinput="{{holding.r}}"/></view><view class="amount-field data-v-1cf27b2a"><view wx:if="{{H}}" class="{{['amount-value', 'data-v-1cf27b2a', holding.t]}}">{{holding.s}}</view><input wx:else class="amount-input data-v-1cf27b2a" type="text" placeholder="盈亏金额" value="{{holding.v}}" bindinput="{{holding.w}}"/></view></view></view></view></view></view><view class="operations-section data-v-1cf27b2a"><text class="section-title data-v-1cf27b2a">今日操作</text><view class="operations-list data-v-1cf27b2a"><view wx:for="{{I}}" wx:for-item="group" wx:key="m" class="operation-group data-v-1cf27b2a"><view class="operation-stock-header data-v-1cf27b2a"><text class="operation-stock data-v-1cf27b2a">{{group.a}}</text><text class="{{['current-price', 'data-v-1cf27b2a', group.c]}}">{{group.b}}</text><text class="{{['price-change', 'data-v-1cf27b2a', group.e]}}">{{group.d}}</text><text class="holder-count data-v-1cf27b2a">{{group.f}}人持有</text></view><view class="operations-list-continuous data-v-1cf27b2a"><view wx:for="{{group.g}}" wx:for-item="op" wx:key="f" class="operation-item data-v-1cf27b2a"><view class="operation-header data-v-1cf27b2a"><view class="{{['operation-type', 'data-v-1cf27b2a', op.c]}}"><text class="type-icon data-v-1cf27b2a">{{op.a}}</text><text class="type-text data-v-1cf27b2a">{{op.b}}</text></view><text class="operation-details data-v-1cf27b2a">价格: {{op.d}} 数量: {{op.e}}</text></view></view></view><view wx:if="{{group.h}}" class="operation-notes data-v-1cf27b2a"><view wx:if="{{group.i}}" class="reasons-section data-v-1cf27b2a"><text class="section-subtitle data-v-1cf27b2a">操作理由</text><view wx:for="{{group.j}}" wx:for-item="reason" wx:key="c" class="reason-item data-v-1cf27b2a"><text class="reason-content data-v-1cf27b2a">{{reason.a}}</text><text class="reason-date data-v-1cf27b2a">{{reason.b}}</text></view></view><view wx:if="{{group.k}}" class="analyses-section data-v-1cf27b2a"><text class="section-subtitle data-v-1cf27b2a">马后炮分析</text><view wx:for="{{group.l}}" wx:for-item="analysis" wx:key="c" class="analysis-item data-v-1cf27b2a"><text class="analysis-content data-v-1cf27b2a">{{analysis.a}}</text><text class="analysis-date data-v-1cf27b2a">{{analysis.b}}</text></view></view></view></view></view></view><view wx:if="{{J}}" class="floating-button data-v-1cf27b2a" bindtap="{{K}}"><text class="float-icon data-v-1cf27b2a">+</text></view><view wx:if="{{L}}" class="edit-buttons data-v-1cf27b2a"><view class="edit-button cancel data-v-1cf27b2a" bindtap="{{M}}"><text class="edit-button-text data-v-1cf27b2a">取消</text></view><view class="edit-button submit data-v-1cf27b2a" bindtap="{{N}}"><text class="edit-button-text data-v-1cf27b2a">保存</text></view></view><view wx:if="{{O}}" class="bottom-button data-v-1cf27b2a" bindtap="{{P}}"><text class="bottom-text data-v-1cf27b2a">提交修改</text></view></view>
\ No newline at end of file
frontend/inversment-diary/unpackage/dist/dev/mp-weixin/pages/index/index.wxss
deleted
100644 → 0
View file @
c5b00f12
.container.data-v-1cf27b2a {
min-height: 100vh;
background: #f5f7fa;
padding-bottom: 120rpx;
}
/* 日期选择器 */
.date-header.data-v-1cf27b2a {
background: white;
padding: 20rpx 30rpx;
border-bottom: 1rpx solid #f0f0f0;
position: -webkit-sticky;
position: sticky;
top: 0;
z-index: 99;
display: flex;
justify-content: space-between;
align-items: center;
}
.date-selector.data-v-1cf27b2a {
display: flex;
align-items: center;
padding: 15rpx 0;
}
.edit-toggle.data-v-1cf27b2a {
padding: 15rpx 25rpx;
background: #007aff;
border-radius: 25rpx;
cursor: pointer;
transition: background-color 0.2s;
}
.edit-toggle.data-v-1cf27b2a:hover {
background: #0056b3;
}
.edit-toggle-text.data-v-1cf27b2a {
color: white;
font-size: 28rpx;
font-weight: 500;
}
.date-text.data-v-1cf27b2a {
color: #333;
font-size: 32rpx;
font-weight: bold;
margin-right: 15rpx;
}
.calendar-icon.data-v-1cf27b2a {
font-size: 28rpx;
color: #007aff;
}
/* 自定义日历 */
.calendar-overlay.data-v-1cf27b2a {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5);
display: flex;
align-items: center;
justify-content: center;
z-index: 1000;
}
.calendar-popup.data-v-1cf27b2a {
background: white;
width: 90%;
max-width: 600rpx;
border-radius: 20rpx;
padding: 30rpx;
box-shadow: 0 10rpx 30rpx rgba(0, 0, 0, 0.3);
}
.calendar-header.data-v-1cf27b2a {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 30rpx;
padding-bottom: 20rpx;
border-bottom: 1rpx solid #f0f0f0;
}
.calendar-title.data-v-1cf27b2a {
font-size: 36rpx;
font-weight: bold;
color: #333;
}
.calendar-nav.data-v-1cf27b2a {
display: flex;
gap: 30rpx;
}
.nav-btn.data-v-1cf27b2a {
width: 60rpx;
height: 60rpx;
background: #f5f5f5;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 24rpx;
color: #666;
}
.calendar-weekdays.data-v-1cf27b2a {
display: grid;
grid-template-columns: repeat(7, 1fr);
gap: 10rpx;
margin-bottom: 20rpx;
}
.weekday.data-v-1cf27b2a {
text-align: center;
color: #999;
font-size: 24rpx;
padding: 15rpx 0;
}
.calendar-days.data-v-1cf27b2a {
display: flex;
flex-direction: column;
gap: 5rpx;
}
.calendar-row.data-v-1cf27b2a {
display: grid;
grid-template-columns: repeat(7, 1fr);
gap: 5rpx;
}
.calendar-day.data-v-1cf27b2a {
aspect-ratio: 1;
display: flex;
align-items: center;
justify-content: center;
border-radius: 8rpx;
cursor: pointer;
transition: all 0.2s;
}
.calendar-day.other-month.data-v-1cf27b2a {
opacity: 0.3;
}
.calendar-day.selected.data-v-1cf27b2a {
background: #007aff;
color: white;
}
.calendar-day.today.data-v-1cf27b2a {
background: #e8f4ff;
color: #007aff;
font-weight: bold;
}
.calendar-day.selected.today.data-v-1cf27b2a {
background: #007aff;
color: white;
}
.day-number.data-v-1cf27b2a {
font-size: 28rpx;
}
/* 可编辑字段样式 */
.editable-field.data-v-1cf27b2a {
display: flex;
align-items: center;
cursor: pointer;
padding: 4rpx 8rpx;
border-radius: 6rpx;
transition: background-color 0.2s;
position: relative;
}
.editable-field.data-v-1cf27b2a:hover {
background-color: rgba(0, 122, 255, 0.1);
}
.edit-icon.data-v-1cf27b2a {
font-size: 20rpx;
margin-left: 8rpx;
opacity: 0.6;
transition: opacity 0.2s;
}
.editable-field:hover .edit-icon.data-v-1cf27b2a {
opacity: 1;
}
/* 账户概览 */
.account-overview.data-v-1cf27b2a {
background: white;
margin: 20rpx;
border-radius: 16rpx;
padding: 30rpx;
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.1);
}
.balance-section.data-v-1cf27b2a {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 30rpx;
}
.balance-left.data-v-1cf27b2a {
flex: 1;
}
.balance-label.data-v-1cf27b2a {
display: block;
color: #666;
font-size: 28rpx;
margin-bottom: 10rpx;
}
.balance-amount.data-v-1cf27b2a {
display: block;
color: #333;
font-size: 48rpx;
font-weight: bold;
}
.balance-input.data-v-1cf27b2a {
max-width: 300rpx;
font-size: 48rpx;
font-weight: bold;
color: #333;
border: 2rpx solid #007aff;
border-radius: 12rpx;
padding: 15rpx 20rpx;
background: #f8f9fa;
box-shadow: 0 2rpx 8rpx rgba(0, 122, 255, 0.1);
}
.profit-input.data-v-1cf27b2a {
max-width: 200rpx;
font-size: 28rpx;
font-weight: bold;
color: #333;
border: 2rpx solid #007aff;
border-radius: 10rpx;
padding: 12rpx 16rpx;
background: #f8f9fa;
text-align: center;
box-shadow: 0 2rpx 8rpx rgba(0, 122, 255, 0.1);
}
.profit-input-wrapper.data-v-1cf27b2a {
margin-top: 8rpx;
display: flex;
justify-content: center;
}
.balance-right.data-v-1cf27b2a {
text-align: center;
}
.asset-label.data-v-1cf27b2a {
display: block;
color: #666;
font-size: 24rpx;
margin-bottom: 10rpx;
}
.progress-circle.data-v-1cf27b2a {
width: 80rpx;
height: 80rpx;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
position: relative;
}
/* 不同仓位等级的颜色 - 这些样式已由动态样式替代,可以保留作为备用 */
.progress-circle.position-safe.data-v-1cf27b2a {
/* background: conic-gradient(#00d4aa 0deg 306deg, #e6f7ff 306deg 360deg); */
}
.progress-circle.position-medium.data-v-1cf27b2a {
/* background: conic-gradient(#ffa502 0deg 306deg, #e6f7ff 306deg 360deg); */
}
.progress-circle.position-high.data-v-1cf27b2a {
/* background: conic-gradient(#ff4757 0deg 306deg, #e6f7ff 306deg 360deg); */
}
.progress-circle.data-v-1cf27b2a::after {
content: '';
width: 60rpx;
height: 60rpx;
background: white;
border-radius: 50%;
position: absolute;
}
.progress-text.data-v-1cf27b2a {
font-size: 24rpx;
font-weight: bold;
z-index: 1;
}
/* 不同仓位等级的文字颜色 */
.position-safe .progress-text.data-v-1cf27b2a {
color: #00d4aa;
}
.position-medium .progress-text.data-v-1cf27b2a {
color: #ffa502;
}
.position-high .progress-text.data-v-1cf27b2a {
color: #ff4757;
}
.profit-section.data-v-1cf27b2a {
display: flex;
justify-content: space-between;
}
.profit-item.data-v-1cf27b2a {
text-align: center;
}
.profit-label.data-v-1cf27b2a {
display: block;
color: #666;
font-size: 24rpx;
margin-bottom: 8rpx;
}
.profit-value.data-v-1cf27b2a {
display: block;
font-size: 28rpx;
font-weight: bold;
}
.profit-value.positive.data-v-1cf27b2a {
color: #ff4757;
}
.profit-value.negative.data-v-1cf27b2a {
color: #00d4aa;
}
/* 持仓 */
.holdings-section.data-v-1cf27b2a {
margin: 20rpx;
}
.section-header.data-v-1cf27b2a {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20rpx;
}
.section-title.data-v-1cf27b2a {
display: block;
color: #333;
font-size: 32rpx;
font-weight: bold;
}
.add-holding-btn.data-v-1cf27b2a {
display: flex;
align-items: center;
gap: 8rpx;
padding: 8rpx 15rpx;
background: #007aff;
border-radius: 20rpx;
color: white;
font-size: 24rpx;
font-weight: 500;
cursor: pointer;
transition: background-color 0.2s;
}
.add-holding-btn.data-v-1cf27b2a:hover {
background: #0056b3;
}
.add-icon.data-v-1cf27b2a {
font-size: 28rpx;
}
.add-text.data-v-1cf27b2a {
font-size: 28rpx;
}
.holdings-grid.data-v-1cf27b2a {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 20rpx;
}
.holding-card.data-v-1cf27b2a {
background: white;
border-radius: 16rpx;
padding: 25rpx;
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.1);
position: relative;
}
.card-deleted.data-v-1cf27b2a {
opacity: 0.5;
pointer-events: none;
background: #f5f5f5;
border: 2rpx dashed #ccc;
}
.card-deleted .stock-name.data-v-1cf27b2a,
.card-deleted .amount-value.data-v-1cf27b2a,
.card-deleted .price-value.data-v-1cf27b2a {
color: #999;
text-decoration: line-through;
}
.card-deleted .delete-btn.data-v-1cf27b2a {
background: #00d4aa;
pointer-events: auto;
}
.delete-btn.data-v-1cf27b2a {
position: absolute;
top: 15rpx;
right: 15rpx;
background: #ff4757;
border-radius: 50%;
width: 50rpx;
height: 50rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 30rpx;
color: white;
z-index: 1;
cursor: pointer;
transition: background-color 0.2s;
}
.delete-btn.data-v-1cf27b2a:hover {
background: #e03e4e;
}
.delete-icon.data-v-1cf27b2a {
font-size: 30rpx;
}
.holding-header.data-v-1cf27b2a {
display: flex;
justify-content: space-between;
align-items: flex-start;
margin-bottom: 20rpx;
}
.stock-name-wrapper.data-v-1cf27b2a {
display: flex;
align-items: center;
}
.stock-name.data-v-1cf27b2a {
color: #333;
font-size: 30rpx;
font-weight: bold;
margin-right: 8rpx;
}
.lock-icon.data-v-1cf27b2a {
font-size: 20rpx;
color: #999;
}
.stock-name-input.data-v-1cf27b2a {
max-width: 200rpx;
font-size: 30rpx;
font-weight: bold;
color: #333;
border: 2rpx solid #007aff;
border-radius: 10rpx;
padding: 12rpx 16rpx;
background: #f8f9fa;
text-align: center;
box-shadow: 0 2rpx 8rpx rgba(0, 122, 255, 0.1);
}
.position-percentage.data-v-1cf27b2a {
font-size: 22rpx;
color: #007aff;
background: #e8f4ff;
padding: 4rpx 10rpx;
border-radius: 6rpx;
}
.stock-change.data-v-1cf27b2a {
font-size: 22rpx;
padding: 4rpx 10rpx;
border-radius: 6rpx;
}
.stock-change.positive.data-v-1cf27b2a {
color: #ff4757;
background: #fff1f0;
}
.stock-change.negative.data-v-1cf27b2a {
color: #00d4aa;
background: #f0fff4;
}
.change-input.data-v-1cf27b2a {
max-width: 100rpx;
font-size: 24rpx;
color: #333;
padding: 12rpx 16rpx;
border-radius: 8rpx;
border: 2rpx solid #007aff;
background: #f8f9fa;
text-align: right;
font-weight: 500;
box-shadow: 0 1rpx 6rpx rgba(0, 122, 255, 0.1);
transition: all 0.2s;
}
.stock-price.data-v-1cf27b2a {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 25rpx;
}
.price-value.data-v-1cf27b2a {
font-size: 40rpx;
font-weight: bold;
color: #333;
}
.price-input.data-v-1cf27b2a {
max-width: 100rpx;
font-size: 40rpx;
font-weight: bold;
color: #333;
border: 2rpx solid #007aff;
border-radius: 10rpx;
padding: 12rpx 16rpx;
background: #f8f9fa;
text-align: right;
box-shadow: 0 2rpx 8rpx rgba(0, 122, 255, 0.1);
}
.holding-amounts.data-v-1cf27b2a {
margin-bottom: 25rpx;
}
.amount-labels.data-v-1cf27b2a {
display: flex;
justify-content: space-between;
margin-bottom: 8rpx;
}
.amount-label.data-v-1cf27b2a {
color: #666;
font-size: 22rpx;
}
.amount-row.data-v-1cf27b2a {
display: flex;
justify-content: space-between;
margin-bottom: 8rpx;
}
.amount-field.data-v-1cf27b2a {
flex: 1;
margin-right: 10rpx;
display: flex;
justify-content: center;
align-items: center;
}
.amount-field.data-v-1cf27b2a:last-child {
margin-right: 0;
}
.amount-value.data-v-1cf27b2a {
color: #333;
font-weight: bold;
font-size: 24rpx;
cursor: pointer;
padding: 2rpx 4rpx;
border-radius: 4rpx;
transition: background-color 0.2s;
}
.amount-value.data-v-1cf27b2a:hover {
background-color: #f0f0f0;
}
.amount-value.profit.data-v-1cf27b2a {
color: #ff4757;
}
.amount-value.loss.data-v-1cf27b2a {
color: #00d4aa;
}
.amount-input.data-v-1cf27b2a {
max-width: 150rpx;
font-size: 24rpx;
color: #333;
padding: 12rpx 16rpx;
border-radius: 8rpx;
border: 2rpx solid #007aff;
background: #f8f9fa;
text-align: right;
font-weight: 500;
box-shadow: 0 1rpx 6rpx rgba(0, 122, 255, 0.1);
transition: all 0.2s;
}
/* 今日操作 */
.operations-section.data-v-1cf27b2a {
margin: 20rpx;
}
.operations-list.data-v-1cf27b2a {
background: white;
border-radius: 16rpx;
overflow: hidden;
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.1);
}
.operation-group.data-v-1cf27b2a {
border-bottom: 1rpx solid #f5f5f5;
padding: 30rpx;
}
.operation-group.data-v-1cf27b2a:last-child {
border-bottom: none;
}
.operation-stock-header.data-v-1cf27b2a {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 20rpx;
gap: 15rpx;
}
.operation-stock.data-v-1cf27b2a {
color: #333;
font-size: 28rpx;
font-weight: bold;
flex-shrink: 0;
}
.current-price.data-v-1cf27b2a {
font-size: 26rpx;
font-weight: bold;
flex-shrink: 0;
}
.current-price.positive.data-v-1cf27b2a {
color: #ff4757;
}
.current-price.negative.data-v-1cf27b2a {
color: #00d4aa;
}
.price-change.data-v-1cf27b2a {
font-size: 22rpx;
padding: 2rpx 8rpx;
border-radius: 4rpx;
font-weight: 500;
flex-shrink: 0;
}
.price-change.positive.data-v-1cf27b2a {
color: #ff4757;
background: #fff1f0;
}
.price-change.negative.data-v-1cf27b2a {
color: #00d4aa;
background: #f0fff4;
}
.holder-count.data-v-1cf27b2a {
font-size: 20rpx;
color: #007aff;
background: #e8f4ff;
padding: 4rpx 8rpx;
border-radius: 6rpx;
font-weight: 500;
flex-shrink: 0;
}
.operations-list-continuous.data-v-1cf27b2a {
margin-bottom: 20rpx;
}
.operations-list-continuous .operation-item.data-v-1cf27b2a {
margin-bottom: 10rpx;
padding: 15rpx;
background: #f8f9fa;
border-radius: 8rpx;
}
.operations-list-continuous .operation-item.data-v-1cf27b2a:last-child {
margin-bottom: 0;
}
.operation-notes.data-v-1cf27b2a {
margin-top: 15rpx;
}
.reasons-section.data-v-1cf27b2a,
.analyses-section.data-v-1cf27b2a {
margin-bottom: 20rpx;
}
.reasons-section.data-v-1cf27b2a:last-child,
.analyses-section.data-v-1cf27b2a:last-child {
margin-bottom: 0;
}
.section-subtitle.data-v-1cf27b2a {
display: block;
font-size: 26rpx;
font-weight: bold;
color: #333;
margin-bottom: 15rpx;
}
.reason-item.data-v-1cf27b2a,
.analysis-item.data-v-1cf27b2a {
background: #fffbeb;
padding: 20rpx;
border-radius: 8rpx;
margin-bottom: 10rpx;
border-left: 4rpx solid #d97706;
}
.analysis-item.data-v-1cf27b2a {
background: #f0f9ff;
border-left: 4rpx solid #0369a1;
}
.reason-item.data-v-1cf27b2a:last-child,
.analysis-item.data-v-1cf27b2a:last-child {
margin-bottom: 0;
}
.reason-content.data-v-1cf27b2a,
.analysis-content.data-v-1cf27b2a {
display: block;
font-size: 24rpx;
line-height: 1.6;
margin-bottom: 8rpx;
}
.reason-content.data-v-1cf27b2a {
color: #d97706;
}
.analysis-content.data-v-1cf27b2a {
color: #0369a1;
}
.reason-date.data-v-1cf27b2a,
.analysis-date.data-v-1cf27b2a {
display: block;
font-size: 20rpx;
color: #999;
text-align: right;
}
.operation-header.data-v-1cf27b2a {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 10rpx;
}
.operation-type.data-v-1cf27b2a {
display: flex;
align-items: center;
padding: 8rpx 16rpx;
border-radius: 8rpx;
gap: 8rpx;
}
.operation-type.buy.data-v-1cf27b2a {
background: #fff1f0;
color: #ff4757;
}
.operation-type.sell.data-v-1cf27b2a {
background: #f0fff4;
color: #00d4aa;
}
.type-icon.data-v-1cf27b2a {
font-size: 20rpx;
}
.type-text.data-v-1cf27b2a {
font-size: 24rpx;
}
.operation-details.data-v-1cf27b2a {
color: #666;
font-size: 24rpx;
}
/* 悬浮按钮 */
.floating-button.data-v-1cf27b2a {
position: fixed;
right: 30rpx;
bottom: 160rpx;
width: 100rpx;
height: 100rpx;
background: #007aff;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 4rpx 12rpx rgba(0, 122, 255, 0.4);
z-index: 100;
}
.float-icon.data-v-1cf27b2a {
color: white;
font-size: 48rpx;
font-weight: 300;
}
/* 底部按钮 */
.bottom-button.data-v-1cf27b2a {
position: fixed;
bottom: 30rpx;
left: 30rpx;
right: 30rpx;
height: 80rpx;
background: #007aff;
border-radius: 40rpx;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 4rpx 12rpx rgba(0, 122, 255, 0.4);
z-index: 100;
}
.bottom-text.data-v-1cf27b2a {
color: white;
font-size: 32rpx;
font-weight: 500;
}
/* 编辑模式按钮 */
.edit-buttons.data-v-1cf27b2a {
position: fixed;
bottom: 160rpx; /* 调整位置,使其在悬浮按钮下方 */
left: 30rpx;
right: 30rpx;
display: flex;
justify-content: space-around;
z-index: 100;
}
.edit-button.data-v-1cf27b2a {
flex: 1;
margin: 0 10rpx;
height: 80rpx;
border-radius: 40rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 32rpx;
font-weight: 500;
cursor: pointer;
transition: background-color 0.2s;
}
.edit-button.cancel.data-v-1cf27b2a {
background-color: #f0f0f0;
color: #333;
}
.edit-button.submit.data-v-1cf27b2a {
background-color: #007aff;
color: white;
}
.edit-button.cancel.data-v-1cf27b2a:hover {
background-color: #e0e0e0;
}
.edit-button.submit.data-v-1cf27b2a:hover {
background-color: #0056b3;
}
.edit-button-text.data-v-1cf27b2a {
font-size: 32rpx;
}
frontend/inversment-diary/unpackage/dist/dev/mp-weixin/project.config.json
deleted
100644 → 0
View file @
c5b00f12
{
"description"
:
"项目配置文件。"
,
"packOptions"
:
{
"ignore"
:
[]
},
"setting"
:
{
"urlCheck"
:
false
,
"es6"
:
true
,
"postcss"
:
false
,
"minified"
:
false
,
"newFeature"
:
true
,
"bigPackageSizeSupport"
:
true
},
"compileType"
:
"miniprogram"
,
"libVersion"
:
""
,
"appid"
:
"wxdbcad78d98ca9fcc"
,
"projectname"
:
"inversment-diary"
,
"condition"
:
{
"search"
:
{
"current"
:
-1
,
"list"
:
[]
},
"conversation"
:
{
"current"
:
-1
,
"list"
:
[]
},
"game"
:
{
"current"
:
-1
,
"list"
:
[]
},
"miniprogram"
:
{
"current"
:
-1
,
"list"
:
[]
}
}
}
\ No newline at end of file
frontend/inversment-diary/unpackage/dist/dev/mp-weixin/static/logo.png
deleted
100644 → 0
View file @
c5b00f12
3.93 KiB