Skip to content

Commit 9077d7d

Browse files
committed
Initial commit
0 parents  commit 9077d7d

26 files changed

Lines changed: 1971 additions & 0 deletions

MyTesla/App/MyTeslaApp.swift

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
//
2+
// MyTeslaApp.swift
3+
// MyTesla
4+
// iOS 17.0+
5+
//
6+
7+
import SwiftUI
8+
import SwiftData
9+
10+
@main
11+
struct MyTeslaApp: App {
12+
var body: some Scene {
13+
WindowGroup {
14+
ContentView()
15+
.modelContainer(for: [
16+
Vehicle.self,
17+
Drive.self,
18+
Charge.self,
19+
Geofence.self,
20+
ElectricityPrice.self
21+
])
22+
}
23+
}
24+
}
25+
26+
struct ContentView: View {
27+
@State private var selectedTab = 0
28+
29+
var body: some View {
30+
TabView(selection: $selectedTab) {
31+
DashboardView()
32+
.tabItem { Label("仪表盘", systemImage: "gauge.medium") }
33+
.tag(0)
34+
TripsView()
35+
.tabItem { Label("行程", systemImage: "list.bullet") }
36+
.tag(1)
37+
MapView()
38+
.tabItem { Label("地图", systemImage: "map") }
39+
.tag(2)
40+
StatisticsView()
41+
.tabItem { Label("统计", systemImage: "chart.bar") }
42+
.tag(3)
43+
SettingsView()
44+
.tabItem { Label("设置", systemImage: "gear") }
45+
.tag(4)
46+
}
47+
}
48+
}

MyTesla/Models/Charge.swift

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
//
2+
// Charge.swift
3+
// MyTesla
4+
//
5+
6+
import Foundation
7+
import SwiftData
8+
9+
@Model
10+
final class Charge {
11+
@Attribute(.unique) var id: Int
12+
var startTime: Date
13+
var endTime: Date
14+
var energyAdded: Double
15+
var cost: Double?
16+
var parkingCost: Double?
17+
var positionLat: Double
18+
var positionLon: Double
19+
var address: String?
20+
var maxPower: Double?
21+
var avgPower: Double?
22+
var socStart: Int
23+
var socEnd: Int
24+
25+
init(id: Int, startTime: Date, endTime: Date, energyAdded: Double, cost: Double? = nil, parkingCost: Double? = nil, positionLat: Double, positionLon: Double, address: String? = nil, maxPower: Double? = nil, avgPower: Double? = nil, socStart: Int, socEnd: Int) {
26+
self.id = id
27+
self.startTime = startTime
28+
self.endTime = endTime
29+
self.energyAdded = energyAdded
30+
self.cost = cost
31+
self.parkingCost = parkingCost
32+
self.positionLat = positionLat
33+
self.positionLon = positionLon
34+
self.address = address
35+
self.maxPower = maxPower
36+
self.avgPower = avgPower
37+
self.socStart = socStart
38+
self.socEnd = socEnd
39+
}
40+
}

MyTesla/Models/ChargeDetail.swift

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
//
2+
// ChargeDetail.swift
3+
// MyTesla
4+
//
5+
6+
import Foundation
7+
8+
struct ChargeDetail: Decodable {
9+
let id: Int
10+
let startTime: Date
11+
let endTime: Date
12+
let energyAdded: Double
13+
let positionLat: Double
14+
let positionLon: Double
15+
let address: String?
16+
let maxPower: Double?
17+
let avgPower: Double?
18+
let socStart: Int
19+
let socEnd: Int
20+
let startIdealRange: Double?
21+
let endIdealRange: Double?
22+
let outsideTemp: Double?
23+
let insideTemp: Double?
24+
let cost: Double?
25+
let parkingCost: Double?
26+
27+
enum CodingKeys: String, CodingKey {
28+
case id
29+
case startTime = "start_time"
30+
case endTime = "end_time"
31+
case energyAdded = "energy_added"
32+
case positionLat = "position_lat"
33+
case positionLon = "position_lon"
34+
case address
35+
case maxPower = "max_power"
36+
case avgPower = "avg_power"
37+
case socStart = "soc_start"
38+
case socEnd = "soc_end"
39+
case startIdealRange = "start_ideal_range"
40+
case endIdealRange = "end_ideal_range"
41+
case outsideTemp = "outside_temp"
42+
case insideTemp = "inside_temp"
43+
case cost
44+
case parkingCost = "parking_cost"
45+
}
46+
}

MyTesla/Models/Drive.swift

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
//
2+
// Drive.swift
3+
// MyTesla
4+
//
5+
6+
import Foundation
7+
import SwiftData
8+
9+
@Model
10+
final class Drive {
11+
@Attribute(.unique) var id: Int
12+
var startTime: Date
13+
var endTime: Date
14+
var startAddress: String?
15+
var endAddress: String?
16+
var distance: Double
17+
var avgEnergy: Double
18+
var duration: Int
19+
var maxSpeed: Double?
20+
var avgSpeed: Double?
21+
var regenEnergy: Double?
22+
var elevationGain: Double?
23+
var outsideTemp: Double?
24+
var category: String?
25+
var subcategory: String?
26+
var note: String?
27+
var insightBadge: String?
28+
29+
init(id: Int, startTime: Date, endTime: Date, startAddress: String? = nil, endAddress: String? = nil, distance: Double, avgEnergy: Double, duration: Int, maxSpeed: Double? = nil, avgSpeed: Double? = nil, regenEnergy: Double? = nil, elevationGain: Double? = nil, outsideTemp: Double? = nil, category: String? = nil, subcategory: String? = nil, note: String? = nil, insightBadge: String? = nil) {
30+
self.id = id
31+
self.startTime = startTime
32+
self.endTime = endTime
33+
self.startAddress = startAddress
34+
self.endAddress = endAddress
35+
self.distance = distance
36+
self.avgEnergy = avgEnergy
37+
self.duration = duration
38+
self.maxSpeed = maxSpeed
39+
self.avgSpeed = avgSpeed
40+
self.regenEnergy = regenEnergy
41+
self.elevationGain = elevationGain
42+
self.outsideTemp = outsideTemp
43+
self.category = category
44+
self.subcategory = subcategory
45+
self.note = note
46+
self.insightBadge = insightBadge
47+
}
48+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
//
2+
// ElectricityPrice.swift
3+
// MyTesla
4+
//
5+
6+
import Foundation
7+
import SwiftData
8+
9+
@Model
10+
final class ElectricityPrice {
11+
@Attribute(.unique) var id: UUID
12+
var name: String
13+
var startHour: Int
14+
var endHour: Int
15+
var pricePerKwh: Double
16+
17+
init(name: String, startHour: Int, endHour: Int, pricePerKwh: Double) {
18+
self.id = UUID()
19+
self.name = name
20+
self.startHour = startHour
21+
self.endHour = endHour
22+
self.pricePerKwh = pricePerKwh
23+
}
24+
}

MyTesla/Models/Geofence.swift

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
//
2+
// Geofence.swift
3+
// MyTesla
4+
//
5+
6+
import Foundation
7+
import SwiftData
8+
9+
@Model
10+
final class Geofence {
11+
@Attribute(.unique) var name: String
12+
var latitude: Double
13+
var longitude: Double
14+
var radius: Double
15+
var electricityPriceId: UUID?
16+
17+
init(name: String, latitude: Double, longitude: Double, radius: Double, electricityPriceId: UUID? = nil) {
18+
self.name = name
19+
self.latitude = latitude
20+
self.longitude = longitude
21+
self.radius = radius
22+
self.electricityPriceId = electricityPriceId
23+
}
24+
}

MyTesla/Models/Trip.swift

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
//
2+
// Trip.swift
3+
// MyTesla
4+
//
5+
6+
import Foundation
7+
8+
struct Trip: Identifiable {
9+
let id: Int
10+
let startTime: Date
11+
let endTime: Date
12+
let startAddress: String?
13+
let endAddress: String?
14+
let startLat: Double?
15+
let startLon: Double?
16+
let endLat: Double?
17+
let endLon: Double?
18+
let distance: Double
19+
let avgEnergy: Double
20+
let duration: Int
21+
let maxSpeed: Double?
22+
let avgSpeed: Double?
23+
let elevationGain: Double?
24+
let regenEnergy: Double?
25+
let outsideTemp: Double?
26+
27+
var category: String?
28+
var note: String?
29+
var insightBadge: String?
30+
}

MyTesla/Models/TripDetail.swift

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
//
2+
// TripDetail.swift
3+
// MyTesla
4+
//
5+
6+
import Foundation
7+
8+
struct TripDetail: Decodable {
9+
let id: Int
10+
let startTime: Date
11+
let endTime: Date
12+
let startAddress: String?
13+
let endAddress: String?
14+
let startLat: Double?
15+
let startLon: Double?
16+
let endLat: Double?
17+
let endLon: Double?
18+
let distance: Double
19+
let avgEnergy: Double
20+
let duration: Int
21+
let maxSpeed: Double?
22+
let avgSpeed: Double?
23+
let elevationGain: Double?
24+
let regenEnergy: Double?
25+
let startOdometer: Double?
26+
let endOdometer: Double?
27+
let startIdealRange: Double?
28+
let endIdealRange: Double?
29+
let outsideTemp: Double?
30+
let insideTemp: Double?
31+
32+
enum CodingKeys: String, CodingKey {
33+
case id
34+
case startTime = "start_time"
35+
case endTime = "end_time"
36+
case startAddress = "start_address"
37+
case endAddress = "end_address"
38+
case startLat = "start_lat"
39+
case startLon = "start_lon"
40+
case endLat = "end_lat"
41+
case endLon = "end_lon"
42+
case distance
43+
case avgEnergy = "avg_energy"
44+
case duration
45+
case maxSpeed = "max_speed"
46+
case avgSpeed = "avg_speed"
47+
case elevationGain = "elevation_gain"
48+
case regenEnergy = "regen_energy"
49+
case startOdometer = "start_odometer"
50+
case endOdometer = "end_odometer"
51+
case startIdealRange = "start_ideal_range"
52+
case endIdealRange = "end_ideal_range"
53+
case outsideTemp = "outside_temp"
54+
case insideTemp = "inside_temp"
55+
}
56+
}

MyTesla/Models/Vehicle.swift

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
//
2+
// Vehicle.swift
3+
// MyTesla
4+
//
5+
6+
import Foundation
7+
import SwiftData
8+
9+
@Model
10+
final class Vehicle {
11+
@Attribute(.unique) var id: Int
12+
var name: String
13+
var model: String?
14+
var softwareVersion: String?
15+
var vin: String?
16+
var carType: String?
17+
var lastUpdated: Date
18+
19+
init(id: Int, name: String, model: String? = nil, softwareVersion: String? = nil, vin: String? = nil, carType: String? = nil, lastUpdated: Date = Date()) {
20+
self.id = id
21+
self.name = name
22+
self.model = model
23+
self.softwareVersion = softwareVersion
24+
self.vin = vin
25+
self.carType = carType
26+
self.lastUpdated = lastUpdated
27+
}
28+
}

MyTesla/Models/VehicleStatus.swift

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
//
2+
// VehicleStatus.swift
3+
// MyTesla
4+
//
5+
6+
import Foundation
7+
8+
struct VehicleStatus: Codable {
9+
let batteryLevel: Int
10+
let range: Double
11+
let insideTemp: Double?
12+
let outsideTemp: Double?
13+
let isCharging: Bool
14+
let chargerPower: Double?
15+
let chargeTimeRemaining: Int?
16+
let latitude: Double
17+
let longitude: Double
18+
let address: String?
19+
let odometer: Double
20+
21+
enum CodingKeys: String, CodingKey {
22+
case batteryLevel = "battery_level"
23+
case range
24+
case insideTemp = "inside_temp"
25+
case outsideTemp = "outside_temp"
26+
case isCharging = "is_charging"
27+
case chargerPower = "charger_power"
28+
case chargeTimeRemaining = "charge_time_remaining"
29+
case latitude
30+
case longitude
31+
case address
32+
case odometer
33+
}
34+
}

0 commit comments

Comments
 (0)