Skip to content
Commits on Source (2)
frontend/inversment-diary/unpackage/dist/*
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
console.log('App Show') console.log('App Show')
}, },
onHide: function() { onHide: function() {
console.log('App Hide') console.log('App Hide');
} }
} }
</script> </script>
......
.container {
min-height: 100vh;
background: #f5f7fa;
padding-bottom: 120rpx;
}
/* 日期选择器 */
.date-header {
background: white;
padding: 20rpx 30rpx;
border-bottom: 1rpx 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: 15rpx 0;
}
.edit-toggle {
padding: 15rpx 25rpx;
background: #007aff;
border-radius: 25rpx;
cursor: pointer;
transition: background-color 0.2s;
}
.edit-toggle:hover {
background: #0056b3;
}
.edit-toggle-text {
color: white;
font-size: 28rpx;
font-weight: 500;
}
.date-text {
color: #333;
font-size: 32rpx;
font-weight: bold;
margin-right: 15rpx;
}
.calendar-icon {
font-size: 28rpx;
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: 600rpx;
border-radius: 20rpx;
padding: 30rpx;
box-shadow: 0 10rpx 30rpx rgba(0, 0, 0, 0.3);
}
.calendar-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 30rpx;
padding-bottom: 20rpx;
border-bottom: 1rpx solid #f0f0f0;
}
.calendar-title {
font-size: 36rpx;
font-weight: bold;
color: #333;
}
.calendar-nav {
display: flex;
gap: 30rpx;
}
.nav-btn {
width: 60rpx;
height: 60rpx;
background: #f5f5f5;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 24rpx;
color: #666;
}
.calendar-weekdays {
display: grid;
grid-template-columns: repeat(7, 1fr);
gap: 10rpx;
margin-bottom: 20rpx;
}
.weekday {
text-align: center;
color: #999;
font-size: 24rpx;
padding: 15rpx 0;
}
.calendar-days {
display: flex;
flex-direction: column;
gap: 5rpx;
}
.calendar-row {
display: grid;
grid-template-columns: repeat(7, 1fr);
gap: 5rpx;
}
.calendar-day {
aspect-ratio: 1;
display: flex;
align-items: center;
justify-content: center;
border-radius: 8rpx;
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: 28rpx;
}
/* 可编辑字段样式 */
.editable-field {
display: flex;
align-items: center;
cursor: pointer;
padding: 4rpx 8rpx;
border-radius: 6rpx;
transition: background-color 0.2s;
position: relative;
}
.editable-field:hover {
background-color: rgba(0, 122, 255, 0.1);
}
.edit-icon {
font-size: 20rpx;
margin-left: 8rpx;
opacity: 0.6;
transition: opacity 0.2s;
}
.editable-field:hover .edit-icon {
opacity: 1;
}
/* 账户概览 */
.account-overview {
background: white;
margin: 20rpx;
border-radius: 16rpx;
padding: 30rpx;
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.1);
}
.balance-section {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 30rpx;
}
.balance-left {
flex: 1;
}
.balance-label {
display: block;
color: #666;
font-size: 28rpx;
margin-bottom: 10rpx;
}
.balance-amount {
display: block;
color: #333;
font-size: 48rpx;
font-weight: bold;
}
.balance-input {
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 {
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 {
margin-top: 8rpx;
display: flex;
justify-content: center;
}
.balance-right {
text-align: center;
}
.asset-label {
display: block;
color: #666;
font-size: 24rpx;
margin-bottom: 10rpx;
}
.progress-circle {
width: 80rpx;
height: 80rpx;
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: 60rpx;
height: 60rpx;
background: white;
border-radius: 50%;
position: absolute;
}
.progress-text {
font-size: 24rpx;
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: 24rpx;
margin-bottom: 8rpx;
}
.profit-value {
display: block;
font-size: 28rpx;
font-weight: bold;
}
.profit-value.positive {
color: #ff4757;
}
.profit-value.negative {
color: #00d4aa;
}
/* 持仓 */
.holdings-section {
margin: 20rpx;
}
.section-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20rpx;
}
.section-title {
display: block;
color: #333;
font-size: 32rpx;
font-weight: bold;
}
.add-holding-btn {
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:hover {
background: #0056b3;
}
.add-icon {
font-size: 28rpx;
}
.add-text {
font-size: 28rpx;
}
.holdings-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 20rpx;
}
.holding-card {
background: white;
border-radius: 16rpx;
padding: 25rpx;
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.1);
position: relative;
}
.card-deleted {
opacity: 0.5;
pointer-events: none;
background: #f5f5f5;
border: 2rpx 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: 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:hover {
background: #e03e4e;
}
.delete-icon {
font-size: 30rpx;
}
.holding-header {
display: flex;
justify-content: space-between;
align-items: flex-start;
margin-bottom: 20rpx;
}
.stock-name-wrapper {
display: flex;
align-items: center;
}
.stock-name {
color: #333;
font-size: 30rpx;
font-weight: bold;
margin-right: 8rpx;
}
.lock-icon {
font-size: 20rpx;
color: #999;
}
.stock-name-input {
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 {
font-size: 22rpx;
color: #007aff;
background: #e8f4ff;
padding: 4rpx 10rpx;
border-radius: 6rpx;
}
.stock-change {
font-size: 22rpx;
padding: 4rpx 10rpx;
border-radius: 6rpx;
}
.stock-change.positive {
color: #ff4757;
background: #fff1f0;
}
.stock-change.negative {
color: #00d4aa;
background: #f0fff4;
}
.change-input {
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 {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 25rpx;
}
.price-value {
font-size: 40rpx;
font-weight: bold;
color: #333;
}
.price-input {
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 {
margin-bottom: 25rpx;
}
.amount-labels {
display: flex;
justify-content: space-between;
margin-bottom: 8rpx;
}
.amount-label {
color: #666;
font-size: 22rpx;
}
.amount-row {
display: flex;
justify-content: space-between;
margin-bottom: 8rpx;
}
.amount-field {
flex: 1;
margin-right: 10rpx;
display: flex;
justify-content: center;
align-items: center;
}
.amount-field:last-child {
margin-right: 0;
}
.amount-value {
color: #333;
font-weight: bold;
font-size: 24rpx;
cursor: pointer;
padding: 2rpx 4rpx;
border-radius: 4rpx;
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: 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 {
margin: 20rpx;
}
.operations-list {
background: white;
border-radius: 16rpx;
overflow: hidden;
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.1);
}
.operation-group {
border-bottom: 1rpx solid #f5f5f5;
padding: 30rpx;
}
.operation-group:last-child {
border-bottom: none;
}
.operation-stock-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 20rpx;
gap: 15rpx;
}
.operation-stock {
color: #333;
font-size: 28rpx;
font-weight: bold;
flex-shrink: 0;
}
.current-price {
font-size: 26rpx;
font-weight: bold;
flex-shrink: 0;
}
.current-price.positive {
color: #ff4757;
}
.current-price.negative {
color: #00d4aa;
}
.price-change {
font-size: 22rpx;
padding: 2rpx 8rpx;
border-radius: 4rpx;
font-weight: 500;
flex-shrink: 0;
}
.price-change.positive {
color: #ff4757;
background: #fff1f0;
}
.price-change.negative {
color: #00d4aa;
background: #f0fff4;
}
.holder-count {
font-size: 20rpx;
color: #007aff;
background: #e8f4ff;
padding: 4rpx 8rpx;
border-radius: 6rpx;
font-weight: 500;
flex-shrink: 0;
}
.operations-list-continuous {
margin-bottom: 20rpx;
}
.operations-list-continuous .operation-item {
margin-bottom: 10rpx;
padding: 15rpx;
background: #f8f9fa;
border-radius: 8rpx;
}
.operations-list-continuous .operation-item:last-child {
margin-bottom: 0;
}
.operation-notes {
margin-top: 15rpx;
}
.reasons-section,
.analyses-section {
margin-bottom: 20rpx;
}
.reasons-section:last-child,
.analyses-section:last-child {
margin-bottom: 0;
}
.section-subtitle {
display: block;
font-size: 26rpx;
font-weight: bold;
color: #333;
margin-bottom: 15rpx;
}
.reason-item,
.analysis-item {
background: #fffbeb;
padding: 20rpx;
border-radius: 8rpx;
margin-bottom: 10rpx;
border-left: 4rpx solid #d97706;
}
.analysis-item {
background: #f0f9ff;
border-left: 4rpx solid #0369a1;
}
.reason-item:last-child,
.analysis-item:last-child {
margin-bottom: 0;
}
.reason-content,
.analysis-content {
display: block;
font-size: 24rpx;
line-height: 1.6;
margin-bottom: 8rpx;
}
.reason-content {
color: #d97706;
}
.analysis-content {
color: #0369a1;
}
.reason-date,
.analysis-date {
display: block;
font-size: 20rpx;
color: #999;
text-align: right;
}
.operation-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 10rpx;
}
.operation-type {
display: flex;
align-items: center;
padding: 8rpx 16rpx;
border-radius: 8rpx;
gap: 8rpx;
}
.operation-type.buy {
background: #fff1f0;
color: #ff4757;
}
.operation-type.sell {
background: #f0fff4;
color: #00d4aa;
}
.type-icon {
font-size: 20rpx;
}
.type-text {
font-size: 24rpx;
}
.operation-details {
color: #666;
font-size: 24rpx;
}
/* 悬浮按钮 */
.floating-button {
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 {
color: white;
font-size: 48rpx;
font-weight: 300;
}
/* 底部按钮 */
.bottom-button {
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 {
color: white;
font-size: 32rpx;
font-weight: 500;
}
/* 编辑模式按钮 */
.edit-buttons {
position: fixed;
bottom: 160rpx;
/* 调整位置,使其在悬浮按钮下方 */
left: 30rpx;
right: 30rpx;
display: flex;
justify-content: space-around;
z-index: 100;
}
.edit-button {
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 {
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: 32rpx;
}
\ No newline at end of file
...@@ -985,918 +985,4 @@ ...@@ -985,918 +985,4 @@
} }
</script> </script>
<style scoped> <style src="./index.css"></style>
.container { \ No newline at end of file
min-height: 100vh;
background: #f5f7fa;
padding-bottom: 120rpx;
}
/* 日期选择器 */
.date-header {
background: white;
padding: 20rpx 30rpx;
border-bottom: 1rpx 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: 15rpx 0;
}
.edit-toggle {
padding: 15rpx 25rpx;
background: #007aff;
border-radius: 25rpx;
cursor: pointer;
transition: background-color 0.2s;
}
.edit-toggle:hover {
background: #0056b3;
}
.edit-toggle-text {
color: white;
font-size: 28rpx;
font-weight: 500;
}
.date-text {
color: #333;
font-size: 32rpx;
font-weight: bold;
margin-right: 15rpx;
}
.calendar-icon {
font-size: 28rpx;
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: 600rpx;
border-radius: 20rpx;
padding: 30rpx;
box-shadow: 0 10rpx 30rpx rgba(0, 0, 0, 0.3);
}
.calendar-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 30rpx;
padding-bottom: 20rpx;
border-bottom: 1rpx solid #f0f0f0;
}
.calendar-title {
font-size: 36rpx;
font-weight: bold;
color: #333;
}
.calendar-nav {
display: flex;
gap: 30rpx;
}
.nav-btn {
width: 60rpx;
height: 60rpx;
background: #f5f5f5;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 24rpx;
color: #666;
}
.calendar-weekdays {
display: grid;
grid-template-columns: repeat(7, 1fr);
gap: 10rpx;
margin-bottom: 20rpx;
}
.weekday {
text-align: center;
color: #999;
font-size: 24rpx;
padding: 15rpx 0;
}
.calendar-days {
display: flex;
flex-direction: column;
gap: 5rpx;
}
.calendar-row {
display: grid;
grid-template-columns: repeat(7, 1fr);
gap: 5rpx;
}
.calendar-day {
aspect-ratio: 1;
display: flex;
align-items: center;
justify-content: center;
border-radius: 8rpx;
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: 28rpx;
}
/* 可编辑字段样式 */
.editable-field {
display: flex;
align-items: center;
cursor: pointer;
padding: 4rpx 8rpx;
border-radius: 6rpx;
transition: background-color 0.2s;
position: relative;
}
.editable-field:hover {
background-color: rgba(0, 122, 255, 0.1);
}
.edit-icon {
font-size: 20rpx;
margin-left: 8rpx;
opacity: 0.6;
transition: opacity 0.2s;
}
.editable-field:hover .edit-icon {
opacity: 1;
}
/* 账户概览 */
.account-overview {
background: white;
margin: 20rpx;
border-radius: 16rpx;
padding: 30rpx;
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.1);
}
.balance-section {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 30rpx;
}
.balance-left {
flex: 1;
}
.balance-label {
display: block;
color: #666;
font-size: 28rpx;
margin-bottom: 10rpx;
}
.balance-amount {
display: block;
color: #333;
font-size: 48rpx;
font-weight: bold;
}
.balance-input {
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 {
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 {
margin-top: 8rpx;
display: flex;
justify-content: center;
}
.balance-right {
text-align: center;
}
.asset-label {
display: block;
color: #666;
font-size: 24rpx;
margin-bottom: 10rpx;
}
.progress-circle {
width: 80rpx;
height: 80rpx;
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: 60rpx;
height: 60rpx;
background: white;
border-radius: 50%;
position: absolute;
}
.progress-text {
font-size: 24rpx;
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: 24rpx;
margin-bottom: 8rpx;
}
.profit-value {
display: block;
font-size: 28rpx;
font-weight: bold;
}
.profit-value.positive {
color: #ff4757;
}
.profit-value.negative {
color: #00d4aa;
}
/* 持仓 */
.holdings-section {
margin: 20rpx;
}
.section-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20rpx;
}
.section-title {
display: block;
color: #333;
font-size: 32rpx;
font-weight: bold;
}
.add-holding-btn {
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:hover {
background: #0056b3;
}
.add-icon {
font-size: 28rpx;
}
.add-text {
font-size: 28rpx;
}
.holdings-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 20rpx;
}
.holding-card {
background: white;
border-radius: 16rpx;
padding: 25rpx;
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.1);
position: relative;
}
.card-deleted {
opacity: 0.5;
pointer-events: none;
background: #f5f5f5;
border: 2rpx 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: 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:hover {
background: #e03e4e;
}
.delete-icon {
font-size: 30rpx;
}
.holding-header {
display: flex;
justify-content: space-between;
align-items: flex-start;
margin-bottom: 20rpx;
}
.stock-name-wrapper {
display: flex;
align-items: center;
}
.stock-name {
color: #333;
font-size: 30rpx;
font-weight: bold;
margin-right: 8rpx;
}
.lock-icon {
font-size: 20rpx;
color: #999;
}
.stock-name-input {
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 {
font-size: 22rpx;
color: #007aff;
background: #e8f4ff;
padding: 4rpx 10rpx;
border-radius: 6rpx;
}
.stock-change {
font-size: 22rpx;
padding: 4rpx 10rpx;
border-radius: 6rpx;
}
.stock-change.positive {
color: #ff4757;
background: #fff1f0;
}
.stock-change.negative {
color: #00d4aa;
background: #f0fff4;
}
.change-input {
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 {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 25rpx;
}
.price-value {
font-size: 40rpx;
font-weight: bold;
color: #333;
}
.price-input {
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 {
margin-bottom: 25rpx;
}
.amount-labels {
display: flex;
justify-content: space-between;
margin-bottom: 8rpx;
}
.amount-label {
color: #666;
font-size: 22rpx;
}
.amount-row {
display: flex;
justify-content: space-between;
margin-bottom: 8rpx;
}
.amount-field {
flex: 1;
margin-right: 10rpx;
display: flex;
justify-content: center;
align-items: center;
}
.amount-field:last-child {
margin-right: 0;
}
.amount-value {
color: #333;
font-weight: bold;
font-size: 24rpx;
cursor: pointer;
padding: 2rpx 4rpx;
border-radius: 4rpx;
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: 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 {
margin: 20rpx;
}
.operations-list {
background: white;
border-radius: 16rpx;
overflow: hidden;
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.1);
}
.operation-group {
border-bottom: 1rpx solid #f5f5f5;
padding: 30rpx;
}
.operation-group:last-child {
border-bottom: none;
}
.operation-stock-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 20rpx;
gap: 15rpx;
}
.operation-stock {
color: #333;
font-size: 28rpx;
font-weight: bold;
flex-shrink: 0;
}
.current-price {
font-size: 26rpx;
font-weight: bold;
flex-shrink: 0;
}
.current-price.positive {
color: #ff4757;
}
.current-price.negative {
color: #00d4aa;
}
.price-change {
font-size: 22rpx;
padding: 2rpx 8rpx;
border-radius: 4rpx;
font-weight: 500;
flex-shrink: 0;
}
.price-change.positive {
color: #ff4757;
background: #fff1f0;
}
.price-change.negative {
color: #00d4aa;
background: #f0fff4;
}
.holder-count {
font-size: 20rpx;
color: #007aff;
background: #e8f4ff;
padding: 4rpx 8rpx;
border-radius: 6rpx;
font-weight: 500;
flex-shrink: 0;
}
.operations-list-continuous {
margin-bottom: 20rpx;
}
.operations-list-continuous .operation-item {
margin-bottom: 10rpx;
padding: 15rpx;
background: #f8f9fa;
border-radius: 8rpx;
}
.operations-list-continuous .operation-item:last-child {
margin-bottom: 0;
}
.operation-notes {
margin-top: 15rpx;
}
.reasons-section,
.analyses-section {
margin-bottom: 20rpx;
}
.reasons-section:last-child,
.analyses-section:last-child {
margin-bottom: 0;
}
.section-subtitle {
display: block;
font-size: 26rpx;
font-weight: bold;
color: #333;
margin-bottom: 15rpx;
}
.reason-item,
.analysis-item {
background: #fffbeb;
padding: 20rpx;
border-radius: 8rpx;
margin-bottom: 10rpx;
border-left: 4rpx solid #d97706;
}
.analysis-item {
background: #f0f9ff;
border-left: 4rpx solid #0369a1;
}
.reason-item:last-child,
.analysis-item:last-child {
margin-bottom: 0;
}
.reason-content,
.analysis-content {
display: block;
font-size: 24rpx;
line-height: 1.6;
margin-bottom: 8rpx;
}
.reason-content {
color: #d97706;
}
.analysis-content {
color: #0369a1;
}
.reason-date,
.analysis-date {
display: block;
font-size: 20rpx;
color: #999;
text-align: right;
}
.operation-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 10rpx;
}
.operation-type {
display: flex;
align-items: center;
padding: 8rpx 16rpx;
border-radius: 8rpx;
gap: 8rpx;
}
.operation-type.buy {
background: #fff1f0;
color: #ff4757;
}
.operation-type.sell {
background: #f0fff4;
color: #00d4aa;
}
.type-icon {
font-size: 20rpx;
}
.type-text {
font-size: 24rpx;
}
.operation-details {
color: #666;
font-size: 24rpx;
}
/* 悬浮按钮 */
.floating-button {
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 {
color: white;
font-size: 48rpx;
font-weight: 300;
}
/* 底部按钮 */
.bottom-button {
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 {
color: white;
font-size: 32rpx;
font-weight: 500;
}
/* 编辑模式按钮 */
.edit-buttons {
position: fixed;
bottom: 160rpx; /* 调整位置,使其在悬浮按钮下方 */
left: 30rpx;
right: 30rpx;
display: flex;
justify-content: space-around;
z-index: 100;
}
.edit-button {
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 {
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: 32rpx;
}
</style>
{
"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
{"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
{"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
Source diff could not be displayed: it is too large. Options to address this: view the blob.
{"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
"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
{
"pages": [
"pages/index/index"
],
"window": {
"navigationBarTextStyle": "white",
"navigationBarTitleText": "韭家投资日记",
"navigationBarBackgroundColor": "#4A90E2",
"backgroundColor": "#f5f5f5"
},
"usingComponents": {}
}
\ No newline at end of file
/*每个页面公共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
"use strict";
const _imports_0 = "/static/logo.png";
exports._imports_0 = _imports_0;
//# sourceMappingURL=../../.sourcemap/mp-weixin/common/assets.js.map
Source diff could not be displayed: it is too large. Options to address this: view the blob.
"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: 2e3
});
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: 2e3
});
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: 2e3
});
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: 2e3
});
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
{
"navigationBarTitleText": "韭家投资日记",
"navigationBarTextStyle": "white",
"navigationBarBackgroundColor": "#4A90E2",
"backgroundColor": "#f5f5f5",
"usingComponents": {}
}
\ No newline at end of file
<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
.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;
}
{
"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